Series和DataFrame--层次化索引

层次化索引(hierarchical indexing)

是pandas的一项重要功能,它使你能在一个轴上拥有多个(两个以上)索引级别

from pandas import Series,DataFrame
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]])
data
a  1    0.663209
   2    0.346579
   3   -0.645685
b  1   -0.278141
   2   -0.552655
   3   -1.181881
c  1    1.083462
   2   -0.976686
d  2    1.911491
   3    0.905117
dtype: float64
data.index
MultiIndex(levels=[['a', 'b', 'c', 'd'], [1, 2, 3]],
           codes=[[0, 0, 0, 1, 1, 1, 2, 2, 3, 3], [0, 1, 2, 0, 1, 2, 0, 1, 1, 2]])
data['b']  # 索引出 所有含 b 的
1   -0.278141
2   -0.552655
3   -1.181881
dtype: float64
data['b':'c']  #索引出 b和c
b  1   -0.278141
   2   -0.552655
   3   -1.181881
c  1    1.083462
   2   -0.976686
dtype: float64
data.ix[['b','d']] #索引出 b和d
b  1   -0.278141
   2   -0.552655
   3   -1.181881
d  2    1.911491
   3    0.905117
dtype: float64
data[:,2]   #索引出待 2 标签的
a    0.346579
b   -0.552655
c   -0.976686
d    1.911491
dtype: float64

unstack() 方法被重新安排到DataFrame中

相当于透视表生成

左侧的索引需要能唯一区分,否则报错

与 stack() 方法互为逆运算

data.unstack()
123
a0.6632090.346579-0.645685
b-0.278141-0.552655-1.181881
c1.083462-0.976686NaN
dNaN1.9114910.905117
data.unstack().stack()
a  1    0.663209
   2    0.346579
   3   -0.645685
b  1   -0.278141
   2   -0.552655
   3   -1.181881
c  1    1.083462
   2   -0.976686
d  2    1.911491
   3    0.905117
dtype: float64

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
OhioColorado
GreenRedGreen
a1012
2345
b1678
291011

各层 轴标签命名

frame.index.names = ['key1','key2']
frame.columns.names = ['state','color']
frame
stateOhioColorado
colorGreenRedGreen
key1key2
a1012
2345
b1678
291011
frame['Ohio']
colorGreenRed
key1key2
a101
234
b167
2910

重排分级顺序

swaplevel() 接受两个级别编号或名称,并返回一个互换了级别的新对象(但数据不会发生变化)

frame.swaplevel('key1','key2')
stateOhioColorado
colorGreenRedGreen
key2key1
1a012
2a345
1b678
2b91011

根据级别汇总统计

许多DataFrame和Series的描述和汇总统计都一个level选项,它用于指定在某条轴上求和的级别

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']
frame
stateOhioColorado
colorGreenRedGreen
key1key2
a1012
2345
b1678
291011
frame.sum(level='key2')  # 按级别 行之间进行汇总求和
stateOhioColorado
colorGreenRedGreen
key2
16810
2121416
frame.sum(level='color',axis=1)   #按级别 列至今进行汇总求和
colorGreenRed
key1key2
a121
284
b1147
22010

set_index()将一个或多个列转换为行索引

默认情况下,那些列会从DataFrame中移除,但也可以将其保留下来drop=False

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
abcd
007one0
116one1
225one2
334two0
443two1
552two2
661two3
frame.set_index(['c','d'])
ab
cd
one007
116
225
two034
143
252
361
frame
abcd
007one0
116one1
225one2
334two0
443two1
552two2
661two3
frame.set_index(['c','d'],drop=False)
abcd
cd
one007one0
116one1
225one2
two034two0
143two1
252two2
361two3

reset_index() 层次化索引的级别会被移到列里

frame
abcd
007one0
116one1
225one2
334two0
443two1
552two2
661two3
frame2 = frame.set_index(['c','d'])
frame2
ab
cd
one007
116
225
two034
143
252
361
frame2.reset_index()
cdab
0one007
1one116
2one225
3two034
4two143
5two252
6two361
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值