重新索引
Series索引处理
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
dtype: float64
调用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
dtype: float64
对于时间序列的有序数据,重新索引需要做一些插值处理。
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
dtype: float64
常用的插值方式有:前向(ffill或pad)、后向(bfill或backfill)
DataFrame索引处理
对于DataFrame,reindex可以修改(行)索引、列,或两个都修改。
frame = DataFrame(np.arange(9).reshape((3, 3)), index=['a', 'c', 'd'],
columns=['Ohio', 'Texas', 'California'])
frame
如果仅传入一个序列,则会重新索引行
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
同时对行和列重新索引,而插值只能按行应用
frame.reindex(index=['a', 'b', 'c', 'd'], method='ffill',
columns=states)
Texas Utah California
a 1 NaN 2
b 1 NaN 2
c 4 NaN 5
d 7 NaN 8
使用ix重新索引
frame.ix[['a', 'b', 'c', 'd'], states]
重复索引
带有重复索引值的Series
obj = Series(range(5), index=['a', 'a', 'b', 'b', 'c'])
索引的is_unique属性可以查看索引值是否唯一
obj.index.is_unique
对Series来说,如果索引对应多个值,则返回Series
obj['a']
a 0
a 1
dtype: int64
对DataFrame的行索引也是如此
df = DataFrame(np.random.randn(4, 3), index=['a', 'a', 'b', 'b'])
df.ix['b']
0 1 2
b 1.669025 -0.438570 -0.539741
b 0.476985 3.248944 -1.021228