pandas中的层次化索引是我们能以低纬度形式处理高纬度数据。
data = Series(np.random.randn(10),index=[['a','a','a','b','b','b','c','c','d','d'],
[1,2,3,1,2,3,1,2,2,3]])
print data
'''
a 1 0.109062
2 0.180636
3 -0.094262
b 1 -1.942745
2 -1.617368
3 1.036303
c 1 0.106169
2 -0.942343
d 2 -0.584220
3 -3.495089
dtype: float64
'''
这样的一个数据集我们可以将它变得更加直观,将它变成只有一层索引的数据:
print data.unstack()
'''
输出结果为:
1 2 3
a -0.391760 1.383009 0.275920
b 0.182211 0.601076 -1.354204
c 1.646033 0.180620 NaN
d NaN -0.719814 -0.545921
'''
这样的变化是可逆的,我们同样可以将这样的一个数据重新逆转回去。
print data.unstack().stack()
'''
输出结果为:
a 1 0.109062
2 0.180636
3 -0.094262
b 1 -1.942745
2 -1.617368
3 1.036303
c 1 0.106169
2 -0.942343
d 2 -0.584220
3 -3.495089
dtype: float64
'''
我们不止可以在行索引上进行分层索引的这用操作,同样列索引也是可以进行的。
这种分层操作是存在一个分级顺序先后的问题,分级顺序我们可以通过swaplevel方法进行重定义
frame = DataFrame(np.arange(12).reshape((4,3)),
index=[['a','a','b','b'],[1,2,1,2]],
columns=[['Ohio','Ohio','Colorado'],
['Green','Red','Green']])
frame.index.names=['key1','key2']
frame.columns.names = ['state','color']
print frame
'''
输出结果为:
state Ohio Colorado
color Green Red Green
key1 key2
a 1 0 1 2
2 3 4 5
b 1 6 7 8
2 9 10 11
'''
print frame.swaplevel('key1','key2')
'''
输出结果为:
state Ohio Colorado
color Green Red Green
key2 key1
1 a 0 1 2
2 a 3 4 5
1 b 6 7 8
2 b 9 10 11
'''
我们可以根据对索引进行的分级进行汇总统计
print frame.sum(level='key2')
'''
输出结果为:
state Ohio Colorado
color Green Red Green
key2
1 6 8 10
2 12 14 16
'''
DataFrame的set_index函数会将其一个或多个列转换为行索引,并创建一个新的DataFrame,这个方法可以指定多个列为索引,这样就会生成一个多层索引的DataFrame,默认情况下被指定的列都会被删除,但是我们可以通过drop=False参数将列保存下来。
整数索引对于DataFrame一般是有歧义的一般不要使用,如果需要的话索引时可以使用ix方法直接进行切片,或者是直接使用irow直接指定是第几行(行号从0开始)
至此pandas库中对数据进行操作的常用方法和思路基本写完。