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
'''
本文來自博客園,僅供參考學習,如有不當之處還望不吝賜教,不勝感激!轉載請注明原文鏈接:http://www.rzrgm.cn/rong-z/p/17606241.html
作者:cnblogs用戶
浙公網安備 33010602011771號