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
'''
posted @ 2023-08-04 16:04  cnblogs用户  阅读(13)  评论(0编辑  收藏  举报