Pandas之重新索引
pandas对象的一个关键的方法是reindex,意味着使数据符合一个新的索引来构造一个新的对象。来看一下下面一个简单的例子:
obj = Series([4.5, 7.2, -5.3, 3.6], index=['d', 'b', 'a', 'c'])
obj
d 4.5
b 7.2
a -5.3
c 3.6
在Series上调用reindex重排数据,使得它符合新的索引,如果那个索引的值不存在就引入缺失数据值:
obj2 = obj.reindex(['a', 'b', 'c', 'd', 'e'])
obj2
a -5.3
b 7.2
c 3.6
d 4.5
e NaN
obj.reindex(['a', 'b', 'c', 'd', 'e'], fill_value=0)
a -5.3
b 7.2
c 3.6
d 4.5
e 0.0
为了对时间序列这样的数据排序,当重建索引的时候可能想要对值进行内插或填充。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
下表格是可用的method选项的清单。在此,内差比正向和反向填充更复杂。
参数 | 描述 |
---|---|
ffill或pad | 前向(或进位)填充 |
bfill或backfill | 后向(或进位)填充 |
对于DataFrame,reindex可以改变(行)索引,列或两者。当只传入一个序列时,结果中的行被重新索引了:
import pandas as pd
import numpy as np
frame = pd.DataFrame(np.arange(9).reshape((3, 3)), index=['a', 'c', 'd'],columns=['Ohio', 'Texas', 'California'])
frame
Ohio Texas California
a 0 1 2
c 3 4 5
d 6 7 8
frame2 = frame.reindex(['a', 'b', 'c', 'd'])
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']
frame.reindex(columns=states)
Texas Utah California
a 1 NaN 2
c 4 NaN 5
d 7 NaN 8
使用带标签索引的ix可以把重新索引做的更简单,但是ix方法在python3中已经被废弃,不建议会用。
frame.ix[['a', 'b', 'c', 'd'], states]
Texas Utah California
a 1 NaN 2
b NaN NaN NaN
c 4 NaN 5
d 7 NaN 8
总而言之,可以使用reindex对column和index进行列索引和行索引的编排,如果出现空值,可以用ffill或者bfile函数来填充,fill_value表示填充值。