看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注: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 索引 分组