python:pandas(5),层次化索引

来源:互联网 发布:软件系统可靠性设计 编辑:程序博客网 时间:2024/06/05 08:07

利用python进行数据分析

第五章:pandas入门

第五节,层次化索引

层次化索引(hierarchical indexing)可使你能在一个轴上拥有多个(两个以上)索引级别。抽象点说,它使你能以低维度形式处理高维度数据。
>>> 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]])
>>> data
a 1 -1.800271
··2 -0.870764
··3 0.600804
b 1 -0.643546
··2 -0.355527
··3 1.599922
c 1 0.213821
··2 2.210991
d 2 -0.309903
··3 0.130301
dtype: float64
>>> data.index
MultiIndex(levels=[[u'a', u'b', u'c', u'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]])
结果是索引之间的“间隔”表示“直接使用上面的标签”
>>> data['b'] #选取外层索引
1 -1.871382
2 -0.941952
3 -0.571710
dtype: float64
>>> data['b'][1] #选取外层索引当中的内层索引
-1.8713820461721136
>>> data['b':'c']
>>>> data.ix[['b','c']] #去除两列索引的方法
b 1 -1.871382
··2 -0.941952
··3 -0.571710
c 1 1.508512
··2 0.191091
dtype: float64
>>> data[:,2] #直接选取内层索引
a -0.101509
b -0.941952
c 0.191091
d 0.007460
dtype: float64
对于多个层次化索引使用unstack方法可被重新安排到一个DataFrame中
>>> type(data)
<class 'pandas.core.series.Series'>
>>> data.unstack()
····1 2 3
a -0.647166 -0.101509 -0.077394
b -1.871382 -0.941952 -0.571710
c 1.508512 0.191091 NaN
d NaN 0.007460 -0.585483
>>> type(data.unstack())
<class 'pandas.core.frame.DataFrame'>
unstack的逆运算是stack
>>> data.unstack().stack()
a 1 -1.800271
··2 -0.870764
··3 0.600804
b 1 -0.643546
··2 -0.355527
··3 1.599922
c 1 0.213821
··2 2.210991
d 2 -0.309903
··3 0.130301
dtype: float64
对于pandas的Series对象可以在横轴设定多层次化索引,而对于一个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']])
>>> frame
····Ohio····Colorado
··Green Red··Green
a 1 0 1 2
··2 3 4 5
b 1 6 7 8
··2 9 10 11
对于横轴来说a和b外层索引分别存在两个索引(1和2),而对于横轴来说Ohio这个外层索引有两个索引(Green和Red)对于Colorado来说只有一个内层索引Green
各层索引均可以命名
>>> frame.index.names=['key1', 'key2']
>>> frame.columns.names=['state', 'color']
>>> 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

1,从排分级顺序

有时需要重新调整某条轴上各级别的顺序,或根据指定级别上的值对数据进行排序,swaplevel接受两个级别编号或名称,并返回一个互换了级别的新对象(但数据不会发生编号)
>>> 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
但只能进行横轴索引进行分级排序,如果想通过纵轴索引进行分级排序需要加入axis=1参数
>>> frame.swaplevel('state', 'color', axis=1)
color··Green··Red··Green
state··Ohio··Ohio··Colorado
key1 key2
a·····1 0 1 2
······2 3 4 5
b·····1 6 7 8
······2 9 10 11

2,根据级别汇总统计

许多对DataFrame和Series的描述和汇总统计都有一个level选项,它用于指定在某条轴上求和的级别。再以上面那个DataFrame为例,可根据行或列上的级别来进行求和
>>> frame.sum(level='key2')
state····Ohio··Colorado
color Green Red Green
key2
1··6 8 10
2··12 14 16
>>> frame.sum(level='color', axis=1)
color Green Red
key1·key2
··a···1 2 1
······2 8 4
··b···1 14 7
······2 20 10

3,使用DataFrame的列

>>> frame=DataFrame({'a': range(7), 'b': range(7, 0, -1), 'c': ['one', 'one', 'one', 'two', 'two', 'two', 'two'], 'd': [0,1,2,0,1,2,3]})
>>> frame
··a·b··c··d
0 0 7 one 0
1 1 6 one 1
2 2 5 one 2
3 3 4 two 0
4 4 3 two 1
5 5 2 two 2
6 6 1 two 3
DataFrame的set_index函数会将其一个或多个列转换为行索引,并创建一个新的DataFrame
>>> frame2=frame.set_index(['c', 'd'])
>>> frame2
······a b
·c··d
one 0 0 7
····1 1 6
····2 2 5
two 0 3 4
····1 4 3
····2 5 2
····3 6 1
set_index方法默认情况下会将索引列的数据移除,但加入drop=False参数可将数据保留下来
>>> frame2=frame.set_index(['c', 'd'], drop=False)
>>> frame2
······a·b··c··d
·c··d
one 0 0 7 one 0
····1 1 6 one 1
····2 2 5 one 2
two 0 3 4 two 0
····1 4 3 two 1
····2 5 2 two 2
····3 6 1 two 3
reset_ index的功能是和set_index正好相反,层次化索引的级别会被转移到列里面

原创粉丝点击