层次化索引
层次化索引(hierarchical indexing)是pandas的一项重要功能,它使你能在一个轴上拥有多个(两个以上)索引级别。抽象点说,它使你能以低维度形式处理高维度数据。我们先来看一个简单的例子:创建一个Series,并用一个由列表或数组组成的列表作为索引。
from pandas import Series
import numpy as np
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)
#output
a 1 1.157065
2 -1.075027
3 -0.800397
b 1 1.255714
2 0.035368
3 -0.833140
c 1 -0.881068
2 -0.943168
d 2 -0.288507
3 -0.130029
dtype: float64
这就是带有MultiIndex索引的Series的格式化输出形式。索引之间的“间隔”表示“直接使用上面的标签”:
print(data.index)
#output
MultiIndex(levels=[['a', 'b', 'c', 'd'], [1, 2, 3]],
labels=[[0, 0, 0, 1, 1, 1, 2, 2, 3, 3], [0, 1, 2, 0, 1, 2, 0, 1, 1, 2]])
对于一个层次化索引的对象,选取数据子集的操作很简单:
print(data['a'])
print(data['a':'c'])
print(data.ix[['a','c']])
#output
1 -1.306784
2 -1.172157
3 0.773601
dtype: float64
a 1 -1.306784
2 -1.172157
3 0.773601
b 1 -0.488442
2 1.447765
3 0.165453
c 1 0.924112
2 -1.192613
dtype: float64
a 1 -1.306784
2 -1.172157
3 0.773601
c 1 0.924112
2 -1.192613
dtype: float64
有时甚至还可以在“内层”中进行选取:
In [267]: data[:, 2]
Out[267]:
a 0.852965
b -2.304234
c -1.332610
d 1.074623
层次化索引在数据重塑和基于分组的操作(如透视表生成)中扮演着重要的角色。比如说,这段数据可以通过其unstack方法被重新安排到一个DataFrame中:
print(data.unstack())
#output
1 2 3
a -0.184154 1.268789 0.330326
b -0.313369 -0.103031 -1.093874
c 0.037298 -2.274778 NaN
d NaN -2.220444 0.769246
unstack的逆运算是stack:
In [269]: data.unstack().stack()
Out[269]:
a 1 0.670216
2 0.852965
3 -0.955869
b 1 -0.023493
2 -2.304234
3 -0.652469
c 1 -1.218302
2 -1.332610
d 2 1.074623
3 0.723642
对于一个DataFrame,每条轴都可以有分层索引:
frame = DataFrame(np.arange(12).reshape((4, 3)),
index=[['a', 'a', 'b', 'b'], [1, 2, 1, 2]],
columns=[['Ohio', 'Ohio', 'Colorado'],
['Green', 'Red', 'Green']])
print(frame)
print(frame['Ohio'])
#output
Ohio Colorado
Green Red Green
a 1 0 1 2
2 3 4 5
b 1 6 7 8
2 9 10 11
Green Red
a 1 0 1
2 3 4
b 1 6 7
2 9 10
其他内容
暂略