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