看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
对于层次索引数据,按层次结构的某个级别进行分组是很自然的需求。由于它本身已经带到了一定的分组属性,再按层级进行分组将会减少相应的层级。
可以按照层级或者索引名进行分组。
arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
index = pd.MultiIndex.from_arrays(arrays, names=['first', 'second'])
s = pd.Series(np.random.randn(8), index=index)
s
'''
first second
bar one 1.228388
two 0.578858
baz one 1.398501
two -0.070547
foo one 0.551245
two -0.604068
qux one 0.643383
two -0.025163
dtype: float64
'''
按层级进行分组:
s.groupby(level=0).sum()
'''
first
bar 1.807246
baz 1.327954
foo -0.052823
qux 0.618220
dtype: float64
'''
按索引名分组:
s.groupby(level='second').sum()
s.sum(level='second') # 也可以直接统计
'''
first
bar 1.807246
baz 1.327954
foo -0.052823
qux 0.618220
dtype: float64
'''
arrays = [['Falcon', 'Falcon', 'Parrot', 'Parrot'],
['Captive', 'Wild', 'Captive', 'Wild']]
index = pd.MultiIndex.from_arrays(arrays, names=('Animal', 'Type'))
df = pd.DataFrame({'Max Speed': [390., 350., 30., 20.]},
index=index)
df
'''
Max Speed
Animal Type
Falcon Captive 390.0
Wild 350.0
Parrot Captive 30.0
Wild 20.0
'''
按层级进行分组:
df.groupby(level=0).mean()
'''
Max Speed
Animal
Falcon 370.0
Parrot 25.0
'''
按索引名分组:
df.groupby(level="Type").mean()
'''
Max Speed
Type
Captive 210.0
Wild 185.0
'''
Series 和 DataFrame 操作一样,以下以 Series 为例:
s # 数据如下
'''
first second third
bar doo one -1.131345
two -0.089329
baz bee one 0.337863
two -0.945867
foo bop one -0.932132
two 1.956030
qux bop one 0.017587
two -0.016692
dtype: float64
'''
两个层级进行分组:
s.groupby(level=['first', 'second']).sum()
'''
first second
bar doo -1.220674
baz bee -0.608004
foo bop 1.023898
qux bop 0.000895
dtype: float64
'''
按层名进行分组,注意,这个和上边使用了两个不同的参数。
s.groupby(['first', 'second']).sum()
'''
first second
bar doo -1.220674
baz bee -0.608004
foo bop 1.023898
qux bop 0.000895
dtype: float64
'''
可以使用 Grouper 分组器进行分组:
arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
index = pd.MultiIndex.from_arrays(arrays, names=['first', 'second'])
df = pd.DataFrame({'A': [1, 1, 1, 1, 2, 2, 3, 3],
'B': np.arange(8)},
index=index)
df
'''
A B
first second
bar one 1 0
two 1 1
baz one 1 2
two 1 3
foo one 2 4
two 2 5
qux one 3 6
two 3 7
'''
使用分组器对第一层索引(second)和 A 列进行分组:
# 三个方式效果一样
df.groupby([pd.Grouper(level=1), 'A']).sum()
df.groupby([pd.Grouper(level='second'), 'A']).sum()
df.groupby(['second', 'A']).sum()
'''
B
second A
one 1 2
2 4
3 6
two 1 4
2 5
3 7
'''
更新时间:2022-04-04 10:21:52 标签:pandas 索引 分组