pandas对象的一个重要方法是reindex,其作用是创建一个适应新索引的新对象。比如如下:
obj = 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
现在想重新调整索引,于是这样操作:
obj2=obj.reindex(['a','b','c','d','e'])
print obj2
a -5.3
b 7.2
c 3.6
d 4.5
e NaN
dtype: float64
不存在的值就添加为NaN
有时候会有很多重复的数据,但是又懒得一个个输入,所以可以进行一些插值处理,reindex中的method方法可以达到此目的,使用ffill方法实现向前值填充,比如:
obj3 = Series(['blue', 'purple', 'yellow'], index=[0, 2, 4])
obj3.reindex(range(6),method='ffill')
0 blue
1 blue
2 purple
3 purple
4 yellow
5 yellow
dtype: object
看结果,分别在0,2,4的前面(1,3,5)分别插入了相应的值
method还有这些参数:
bfill向后填充
pad向前搬运
backfill向后搬运,大家可以试试效果
如果有一个DataFrame对象,我现在想更改它的索引怎么办,使用reindex方法
比如:
frame=DataFrame(np.arange(9).reshape((3,3)),index=['a','c','d'],columns=['Ohio','Texas','California'])
Ohio Texas California
a 0 1 2
c 3 4 5
d 6 7 8
现在这个索引是['a','c','d'],我想改成['a','b','c','d']怎么办,执行以下操作就可以:
frame2=frame.reindex(['a','b','c','d'])
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
结果b这一行为NaN,因为我们没有给它任何值,所以全部是NaN
同样,使用 columns 关键字可以使列重新索引:
states = ['Texas', 'Utah', 'California']
frame.reindex(columns=states)
Texas Utah California
a 1 NaN 2
c 4 NaN 5
d 7 NaN 8
同样Utah这一列我们没有给任何数据,所以也为NaN
对于DataFrame,我们同样可以像Series一样进行插值查找,比如:
Ohio Texas California
a 0 1 2
c 3 4 5
d 6 7 8
frame.reindex(['a','b','c','d'],method='ffill')
Ohio Texas California
a 0 1 2
b 0 1 2
c 3 4 5
d 6 7 8
需要注意的是,插值只在行侧(0坐标轴)进行,即这样操作是没有用的:
frame.reindex(columns=['Texas', 'Ohio', 'California','wzh'],method='ffill')
以下两种操作是等价的:
frame.ix[['a', 'b', 'c', 'd'], ['Texas', 'Ohio', 'California']]
frame.reindex(index=['a', 'b', 'c', 'd'],columns=['Texas', 'Ohio', 'California'])
下面是reindex具体的参数: