pandas学习笔记-重新索引
pandas对象的一个重要方法是reindex,其作用是创建一个适应新索引的新对象。以一个简单示例来说:
import pandas as pd
obj = pd.Series([4.5,7.2,-5.3,3.6],index=['d','b','a','c'])
print obj
结果
d 4.5
b 7.2
a -5.3
c 3.6
dtype: float64
调用该Series的reindex将会根据新索引进行重排。如果某个索引值当前不存在,就引入缺失值:
obj1 = obj.reindex(['a','b','c','d','e'])
print obj1
结果
a -5.3
b 7.2
c 3.6
d 4.5
e NaN
dtype: float64
obj2 = obj.reindex(['a','b','c','d','e'],fill_value=0)
print obj2
结果
a -5.3
b 7.2
c 3.6
d 4.5
e 0.0
dtype: float64
对于时间序列这样的有序数组,重新索引时可能需要做一些插值处理。method选项即可达到此目的,例如,使用ffill可以实现向前值填充:
obj3 = pd.Series(['blue','purple','yellow'],index=[0,2,4])
obj4 = obj3.reindex(range(6),method='ffill')
print obj4
结果
0 blue
1 blue
2 purple
3 purple
4 yellow
5 yellow
dtype: object
reindex的(插值)method选项
参数 | 说明 |
---|---|
ffill或pad | 向前填充(或搬运)值 |
bfill或backfill | 向后填充(或搬运)值 |
对于DataFrame,reindex可以修改(行)索引、列,或两个都修改。如果仅传入一个序列,则会重新索引行:
frame = pd.DataFrame(np.arange(9).reshape((3,3)),index=['a','c','d'],columns=['Ohio','Texas','California'])
print frame
结果
Ohio Texas California
a 0 1 2
c 3 4 5
d 6 7 8
frame2 = frame.reindex(['a','b','c','d'])
print frame2
结果
Ohio Texas California
a 0.0 1.0 2.0
b NaN NaN NaN
c 3.0 4.0 5.0
d 6.0 7.0 8.0
使用columns关键字即可重新索引列:
states = ['Texas','Utah','California']
frame3 = frame.reindex(columns=states)
print frame3
结果
Texas Utah California
a 1 NaN 2
c 4 NaN 5
d 7 NaN 8
也可以同时对行和列进行重新索引,而插值则只能按行应用(即轴0):
frame4 = frame.reindex(index=['a','b','c','d'],method='ffill',columns=states)
print frame4
结果
Texas Utah California
a 1 NaN 2
b 1 NaN 2
c 4 NaN 5
d 7 NaN 8
利用ix的标签索引功能,重新索引任务可以变得更简洁:
frame5 = frame.ix[['a','b','c','d'],states]
print frame5
结果
Texas Utah California
a 1.0 NaN 2.0
b NaN NaN NaN
c 4.0 NaN 5.0
d 7.0 NaN 8.0