Pandas之Groupby
Pandas中的groupby用于将某些类别进行数据分组,然后对每个组分别执行基础的统计以及复杂的聚合、转换和过滤等操作。
常见的用途有:
- 汇总统计:快速计算每组的总和、平均值等。
- 数据对比:比较不同组之间的表现差异。
- 异常值检测:发现某些组内的异常数据点。
- 特征工程:在机器学习中,利用组间统计量创建新特征(如组内平均、组内计数等)。
- 数据清洗:根据组的统计信息进行数据修正或填补缺失值。
基础统计
比如数据电商的水果销售数据,然后进行多种不同分组的统计,第一种按照水果类别进行统计总销售额:
import pandas as pd
data = {
'Date': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02',
'2023-01-03', '2023-01-03', '2023-01-04', '2023-01-04'],
'Category': ['水果', '蔬菜', '水果', '饮料', '蔬菜', '饮料', '水果', '蔬菜'],
'Sell': [200, 150, 220, 180, 160, 190, 210, 170]
}
df = pd.DataFrame(data)
grouped = df.groupby('Category')['Sell'].sum()
>>> print(grouped)
Category
水果 630
蔬菜 480
饮料 370
Name: Sell, dtype: int64
第二种为按照两个数据进行分组,这里按照日期和水果类别统计:
grouped = df.groupby(['Date', 'Category'])['Sell'].sum()
>>> print(grouped)
Date Category
2023-01-01 水果 200
蔬菜 150
2023-01-02 水果 220
饮料 180
2023-01-03 蔬菜 160
饮料 190
2023-01-04 水果 210
蔬菜 170
Name: Sell, dtype: int64
复杂统计
常见的复杂统计主要几种在聚合(aggregation)、转换(transformation)和过滤(Filtering)。
聚合
聚合用于将分组用于一个或者多个统计函数,比如sum/mean/max/min/count等,调用聚合需要使用agg方法。
grouped = df.groupby(['Category'])['Sell'].agg(['sum', 'max', 'min'])
>>> print(grouped)
sum max min
Category
水果 630 220 200
蔬菜 480 170 150
饮料 370 190 180
转换
对每个组内的数据进行转换,返回一个原数据大小相同的副本结果(即非分组前的大小,但是统计还是按照分组再进行统计),转换需要使用transform方法,该方法接受一个函数或者lambda函数,用于转换每个组内的每个值。
grouped = df.groupby(['Category'])['Sell'].transform(lambda x : x + 1)
>>> print(grouped)
0 201
1 151
2 221
3 181
4 161
5 191
6 211
7 171
过滤
根据某些条件筛选出满足条件的**组(这里是组为单位),**并返回原始数据不包含筛选掉的组的数据,需要使用filter方法进行过滤。
比如下面的方法,按照类别统计了后,其中饮料的组别筛除了,所以返回的数据里面没有饮料的类别。
grouped = df.groupby(['Category']).filter(lambda x : x['Sell'].sum() > 400)
print(grouped)
0 2023-01-01 水果 200
1 2023-01-01 蔬菜 150
2 2023-01-02 水果 220
4 2023-01-03 蔬菜 160
6 2023-01-04 水果 210
7 2023-01-04 蔬菜 170
#原始数据对比
Date Category Sell
0 2023-01-01 水果 200
1 2023-01-01 蔬菜 150
2 2023-01-02 水果 220
3 2023-01-02 饮料 180
4 2023-01-03 蔬菜 160
5 2023-01-03 饮料 190
6 2023-01-04 水果 210
7 2023-01-04 蔬菜 170