pandas之groupby
数据准备
import pandas as pd
product_info = {
"产品": ["李子", "桃子", "香蕉", "饺子", "馒头", "包子", "猪肉", "牛肉"],
"分类": ["水果", "水果", "水果", "生鲜", "生鲜", "生鲜", "肉类", "肉类"],
"价格": [23, 12, 5, 19, 2, 3, 20, 40],
"销量": [1821, 232, 675, 210, 4320, 5829, 9762, 1320],
}
df = pd.DataFrame(product_info)
print(df)
"""
产品 分类 价格 销量
0 李子 水果 23 1821
1 桃子 水果 12 232
2 香蕉 水果 5 675
3 饺子 生鲜 19 210
4 馒头 生鲜 2 4320
5 包子 生鲜 3 5829
6 猪肉 肉类 20 9762
7 牛肉 肉类 40 1320
"""
方法介绍
单列聚合求平均、求和
# 1、单列聚合求平均,返回DataFrame
df1 = df.groupby('分类', as_index=False)['价格'].mean()
print(df1)
'''
0 水果 13.333333
1 生鲜 8.000000
2 肉类 30.000000
'''
# 2、单列聚合求和,返回DataFrame
df2 = df.groupby('分类', as_index=False)['价格'].sum()
print(df2)
'''
分类 价格
0 水果 40
1 生鲜 24
2 肉类 60
'''
多列聚合求平均
df = df.groupby('分类', as_index=False)[['价格', '销量']].mean()
print(df)
'''
分类 价格 销量
0 水果 13.333333 909.333333
1 生鲜 8.000000 3453.000000
2 肉类 30.000000 5541.000000
'''
多列多个聚合
df = df.groupby('分类')[["价格", "销量"]].agg(['mean', 'max'])
print(df)
'''
价格 销量
mean max mean max
分类
水果 13.333333 23 909.333333 1821
生鲜 8.000000 19 3453.000000 5829
肉类 30.000000 40 5541.000000 9762
'''
对聚合结果重命名
df = df.groupby('分类', as_index=False)[['价格']].agg(平均价格=('价格', 'mean'), 最高价格=('价格', 'max'))
print(df)
'''
分类 平均价格 最高价格
0 水果 13.333333 23
1 生鲜 8.000000 19
2 肉类 30.000000 40
'''
多列分组
df = df.groupby(['产品', '分类'], as_index=False).agg(平均价格=('价格', 'mean'))
print(df)
'''
产品 分类 平均价格
0 包子 生鲜 3.0
1 李子 水果 23.0
2 桃子 水果 12.0
3 牛肉 肉类 40.0
4 猪肉 肉类 20.0
5 饺子 生鲜 19.0
6 馒头 生鲜 2.0
7 香蕉 水果 5.0
'''
多列分组排序
# 根据平均价格降序排序
df = df.groupby(['产品', '分类'], as_index=False).agg(平均价格=('价格', 'mean')).sort_values(by='平均价格', ascending=False)
print(df)
'''
产品 分类 平均价格
3 牛肉 肉类 40.0
1 李子 水果 23.0
4 猪肉 肉类 20.0
5 饺子 生鲜 19.0
2 桃子 水果 12.0
7 香蕉 水果 5.0
0 包子 生鲜 3.0
6 馒头 生鲜 2.0
'''
topN
# 1、销量最高的2个分类
df = df.groupby('分类')['销量'].nlargest(2)
print(df)
'''
分类
水果 0 1821
2 675
生鲜 5 5829
4 4320
肉类 6 9762
7 1320
Name: 销量, dtype: int64
'''
# 2、销量最少的3个分类
df = df.groupby('分类')['销量'].nsmallest(3)
print(df)
'''
分类
水果 1 232
2 675
0 1821
生鲜 3 210
4 4320
5 5829
肉类 7 1320
6 9762
Name: 销量, dtype: int64
'''
唯一值
df = df.groupby('分类', as_index=False).agg(unique_values=('产品', 'unique'))
print(df)
'''
分类 unique_values
0 水果 [李子, 桃子, 香蕉]
1 生鲜 [饺子, 馒头, 包子]
2 肉类 [猪肉, 牛肉]
'''
唯一值的数量
df = df.groupby('分类', as_index=False).agg(num_unique_values=('产品', 'nunique'))
print(df)
'''
分类 num_unique_values
0 水果 3
1 生鲜 3
2 肉类 2
'''
分组的个数
df = df.groupby('分类').ngroups
print(df)
'''
3
'''
获得某个特定分组
# 分类、产品跟get_group的参数必须对应
df = df.groupby(['分类', '产品']).get_group(('水果', '李子'))
print(df)
'''
产品 分类 价格 销量
0 李子 水果 23 1821
'''
rank
# 对每个组中的行进行排序,如:按价格进行降序排序
df['dense_rank'] = df.groupby('分类')['价格'].rank(ascending=False, method='dense')
print(df)
'''
产品 分类 价格 销量 dense_rank
0 李子 水果 23 1821 3.0
1 桃子 水果 12 232 2.0
2 香蕉 水果 5 675 1.0
3 饺子 生鲜 19 210 3.0
4 馒头 生鲜 2 4320 1.0
5 包子 生鲜 3 5829 2.0
6 猪肉 肉类 20 9762 1.0
7 牛肉 肉类 40 1320 2.0
'''
展开求和
df['price'] = df.groupby('分类')['价格'].expanding().sum().values
print(df)
'''
产品 分类 价格 销量 price
0 李子 水果 23 1821 23.0
1 桃子 水果 12 232 35.0
2 香蕉 水果 5 675 40.0
3 饺子 生鲜 19 210 19.0
4 馒头 生鲜 2 4320 21.0
5 包子 生鲜 3 5829 24.0
6 猪肉 肉类 20 9762 20.0
7 牛肉 肉类 40 1320 60.0
'''
本文来自博客园,仅供参考学习,如有不当之处还望不吝赐教,不胜感激!转载请注明原文链接:https://www.cnblogs.com/rong-z/p/17606241.html
作者:cnblogs用户