看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
之前我们了解到,对 df 进行 groupby  分组后会产生一个 pandas.DataFrame.groupby 分组对象,我们可以对这个对象进行各种操作来满足我们分组后的统计需求。
有以下动物最大速度数据:
df = pd.DataFrame([('bird', 'Falconiformes', 389.0),
                   ('bird', 'Psittaciformes', 24.0),
                   ('mammal', 'Carnivora', 80.2),
                   ('mammal', 'Primates', np.nan),
                   ('mammal', 'Carnivora', 58)],
                  index=['falcon', 'parrot', 'lion',
                         'monkey', 'leopard'],
                  columns=('class', 'order', 'max_speed'))
df
'''
          class           order  max_speed
falcon     bird   Falconiformes      389.0
parrot     bird  Psittaciformes       24.0
lion     mammal       Carnivora       80.2
monkey   mammal        Primates        NaN
leopard  mammal       Carnivora       58.0
'''
使用以下形式进行分组,产生分组对象:
grouped = df.groupby('class') # 单个列
grouped = df.groupby('order', axis='columns') # 按行
grouped = df.groupby(['class', 'order']) # 多个
可以使用 get_group()  查看单个分组的内容:
grouped.get_group('bird') # 查看鸟类分组内容
'''
       class           order  max_speed
falcon  bird   Falconiformes      389.0
parrot  bird  Psittaciformes       24.0
'''
注意:由于从 pandas 2.1( 2023年08月30日更新)开始,将不建议参数 axis=1 在 DataFrame.groupby() 中使用,推荐 frame.T.groupby(...) 方法,即先将 DataFrame 转置,再分组。
关于 groupby() 的更加详细介绍可以访问 groupby()。
分组依据(就是 groupby 后边括号里的内容)可以使用以下方式来定义:
# 以下使用学生成绩表数据
# 按索引奇偶行分组 True False 两组
df.groupby(lambda x:x%2==0)
# 按前后50个分组  True False 两组
df.groupby(lambda x:x>=50)
# 列名包含 Q 的分成一组
df.groupby(lambda x:'Q' in x, axis=1).sum()
# 传入字典完成分组,键为原索引名,值为分组名
# 可实现只对部分分组
(
    df.set_index('team')
    .groupby({'A': 'A组', 'B': 'B组'})
    .sum()
)
# 以下使用学生成绩表数据
# 按索引奇偶行分组 True False 两组
df.groupby(df.index%2==0) # 同上
# 按姓名首字母分组
df.groupby(df.name.str[0])
# 按 AB-其他团队 分组
df.groupby(df.team.isin(['A','B']))
# 按姓名第一个字母和第二个字母分组
df.groupby([df.name.str[0], df.name.str[1]])
# 按日期小时分组
df.groupby([df.time.date, df.time.hour])
# 按日期中的年份分组
df.groupby(df.time.apply(lambda x:x.year)).count()
# 姓名首字母元音辅音分组
def get_letter_type(letter):
    if letter[0].lower() in 'aeiou':
        return 'vowel'
    else:
        return 'consonant'
# 使用函数
df.set_index('name').groupby(get_letter_type).sum()
可以将以上方法混合组成列表使用:
# 使用了 python 表达式和列名
df.groupby([lambda x:x>=50, 'team']).sum()
可以将 pd.DataFrame.groupby 应用到数据中:
df.pipe(pd.DataFrame.groupby, 'team').sum()
Grouper 允许指定 groupby 分组依据,功能非常强大,详见分组器 Grouper 。
多层索引按指定索引的分组可参阅。
Groupby 操作后分组字段会成为索引,如果不想让它成为索引,可以使用 as_index=False 进行设置:
df.groupby('team', as_index=False).sum()
'''
  team    Q1    Q2    Q3    Q4
0    A  1066   639   875   783
1    B   975  1218  1202  1136
2    C  1056  1194  1068  1127
3    D   860  1191  1241  1199
4    E   963  1013   881  1033
'''
如果要对分组对象进行注解,可以用以下方法:
from pandas.core.groupby.generic import DataFrameGroupBy, SeriesGroupBy
def func(dgb: DataFrameGroupBy, sgb: SeriesGroupBy):
    ...
更新时间:2023-09-01 12:37:58 标签:pandas 分组 对象