层次化索引
data = pd.Series(np.random.randn(9),
index=[['a','a','a','b','b','c','c','d','d'],
[1,2,3,1,3,1,2,2,3]])
data.index
创建一个Series,通过index属性可以获取其索引。
使用索引和切片选择层次化Series的数据。
选择第一层的索引b
切片选择索引b-c
通过loc选择索引b、c
选择第一层索引的第二行数据。
通过unstack方法将两层索引的Series转为DataFrame,第二层转为列索引。
unstack的逆运算是stack,将DataFrame转为Series,列索引变成行索引的第二层。
DataFrame的每条轴都可以有分层索引。
frame = pd.DataFrame(np.arange(12).reshape((4,3)),
index=[['a','a','b','b'],[1,2,1,2]],
columns=[['Ohio','Ohio','Colorado'],
['Green','Red','Green']])
创建一个4行3列的DataFrame,行列索引都有两层。
通过index.names可以为行索引命名,columns.names为列索引命名。
frame.index.names = ['key1','key2']
frame.columns.names = ['state','color']
通过索引选取列分组。
可以单独创建MultiIndex然后复用。
pd.MultiIndex.from_arrays([['Ohio','Ohio','Colorado'],['Green','Red','Green']],
names=['state','color'])
a = pd.MultiIndex.from_arrays([['Ohio','Ohio','Colorado'],['Green','Red','Green']],
names=['state','color'])
b = pd.Series(np.random.randn(3),index=a)
重排与分级排序
DataFrame的swaplevel方法可以将分层位置对换。
frame.swaplevel('key1','key2')
sort_index方法根据单个级别中的值对数据进行排序。
frame.sort_index(level=1)
frame.sort_index(level=0)
level=1表示按照key2列进行排序。
level=0表示按照key1列进行排序。
结合swaplevel方法和sort_index方法
frame.swaplevel(0,1).sort_index(level=0)
根据级别汇总统计
sum函数通过传入level参数可以对指定列进行汇总。
frame.sum(level='key2')
默认axis=0,即行索引,改为axis=1可以对列索引进行求和
frame.sum(level='color',axis=1) #对第二层列索引进行求和。
使用DataFrame的列进行索引
frame = pd.DataFrame({'a': range(7), 'b': range(7, 0, -1),^M
'c': ['one', 'one', 'one', 'two', 'two',^M
'two', 'two'],^M
'd': [0, 1, 2, 0, 1, 2, 3]})
frame2 = frame.set_index(['c','d'])
创建一个七行四列的DataFrame,通过set_index方法可以将DataFrame中的指定列设为行索引。如set_index(['c','d'])表示将c列和d列分别设置为一级行索引和二级行索引。
默认情况下会将设置为索引的原数据删除,可以设置drop=False参数保留。
frame.set_index(['c','d'],drop=False)
reset_index的功能跟set_index刚好相反,层次化索引被转回列中。
frame2.reset_index()