Python案例:如何用Pandas做数据聚合统计——从入门到实战
文章目录导读
- 引言:为什么数据聚合是数据分析的核心技能?
- Pandas数据聚合基础:分组与聚合函数详解
- 案例实操:使用Pandas对销售数据进行聚合统计
- 高级技巧:多级聚合、自定义聚合与性能优化
- 常见问题与解答(FAQ)
- 掌握聚合,开启数据分析高效之路
引言:为什么数据聚合是数据分析的核心技能?
在数据驱动的时代,无论是业务报表、用户行为分析还是金融风控,我们面对的数据往往是海量且零散的。数据聚合(Aggregation)正是将原始数据按照特定维度进行分组,并计算汇总指标的过程,Python的Pandas库凭借其强大的groupby机制,成为了数据科学领域最常用的聚合工具之一。

核心价值:
- 从百万行数据中快速提取业务洞察(如:按月份统计销售额)
- 动态生成多种统计量(均值、总和、标准差等)
- 支持复杂的分组逻辑(多列分组、时间窗口聚合)
问:Pandas的groupby和SQL的GROUP BY有什么区别?
答:两者核心逻辑相同,但Pandas更灵活,Pandas支持对分组后的数据进行自定义函数处理、多层索引操作,并且可以无缝衔接其他Python库(如Matplotlib进行可视化),Pandas的agg方法允许一次调用多个聚合函数,这是SQL较难实现的。
Pandas数据聚合基础:分组与聚合函数详解
1 核心方法:groupby()
groupby()是Pandas中实现“拆分-应用-合并”操作的基础,它的工作流如下:
- 拆分:根据指定的键将DataFrame拆分成多个组
- 应用:对每个组独立执行聚合函数(如
sum、mean) - 合并:将各组的计算结果组合成新的DataFrame
import pandas as pd
# 示例数据:销售记录
df = pd.DataFrame({
'部门': ['销售部', '技术部', '销售部', '技术部', '市场部'],
'销售额': [12000, 15000, 11000, 18000, 9000],
'成本': [8000, 10000, 7000, 12000, 6000]
})
# 按部门分组,计算平均销售额
result = df.groupby('部门')['销售额'].mean()
print(result)
2 常用聚合函数一览
| 函数 | 用途 | 示例 |
|---|---|---|
sum() |
求和 | group['列'].sum() |
mean() |
平均值 | 同上 |
count() |
非空值计数 | group.count() |
std() |
标准差 | 常用于波动性分析 |
min()/max() |
最小/最大值 | 寻找极值 |
first()/last() |
第一个/最后一个值 | 时间序列常用 |
3 多列分组与选择列
# 按部门和季度分组,查看销售额总和 df['季度'] = ['Q1', 'Q1', 'Q2', 'Q2', 'Q1'] result = df.groupby(['部门', '季度'])['销售额'].sum()
问:分组后返回的是Series还是DataFrame?
答:如果只选择一列(如['销售额']),返回的是Series;如果选择多列或整个DataFrame,返回的是DataFrame,可以在分组后使用保持DataFrame结构,例如df.groupby('部门')[['销售额', '成本']].mean()。
案例实操:使用Pandas对销售数据进行聚合统计
1 场景说明
假设我们有一份2024年的电商销售数据(CSV文件):
import pandas as pd
# 读取数据(实际中可从文件读取)
data = {
'日期': ['2024-01-05', '2024-01-05', '2024-02-10', '2024-02-10', '2024-03-15'],
'产品类别': ['电子产品', '服装', '电子产品', '服装', '食品'],
'销售额': [5000, 3000, 6000, 4000, 2000],
'用户ID': ['U001', 'U002', 'U001', 'U003', 'U002']
}
df = pd.DataFrame(data)
df['日期'] = pd.to_datetime(df['日期'])
2 需求1:按月统计各产品类别的总销售额
# 提取月份作为新列 df['月份'] = df['日期'].dt.month # 聚合统计 monthly_sales = df.groupby(['月份', '产品类别'])['销售额'].sum().reset_index() print(monthly_sales)
输出示例:
月份 产品类别 销售额
0 1 服装 3000
1 1 电子产品 5000
2 2 服装 4000
3 2 电子产品 6000
4 3 食品 2000
3 需求2:同时计算销售额的总和、平均值和计数
使用agg()方法可以一次性应用多个聚合函数:
result = df.groupby('产品类别')['销售额'].agg(['sum', 'mean', 'count'])
result.columns = ['总销售额', '平均销售额', '订单数']
print(result)
4 需求3:找出销售额最高的月份(按产品类别)
idx = df.groupby('产品类别')['销售额'].idxmax()
top_months = df.loc[idx, ['产品类别', '月份', '销售额']]
print(top_months)
问:
reset_index()的作用是什么?
答:groupby默认将分组键作为索引,使用reset_index()可以将分组键转换为普通列,更便于后续合并或导出,如果不使用,结果是一个多层索引的DataFrame。
高级技巧:多级聚合、自定义聚合与性能优化
1 多级聚合(MultiIndex)
当分组键包含多个层次时,Pandas会生成MultiIndex,这可以用来创建复杂的汇总表:
# 按产品和月份分组,保留两个层次
result = df.groupby(['产品类别', '月份']).agg({'销售额': 'sum', '用户ID': 'nunique'})
# nunique用于统计不同用户的数量
2 自定义聚合函数
如果Pandas内置函数不够用,可以在agg()中传入自定义函数:
def range_func(x):
return x.max() - x.min()
result = df.groupby('产品类别')['销售额'].agg(['sum', range_func, 'mean'])
result.columns = ['总和', '极差', '平均值']
3 性能优化技巧
- 使用
categorical数据类型:如果分组列是字符串且重复值多,转换为category类型可大幅加速分组:df['产品类别'] = df['产品类别'].astype('category') - 避免不必要的
reset_index():如果后续操作不需要普通列索引,保留索引可减少内存开销。 - 使用
transform()进行组内计算:例如计算每个组的平均销售额并添加到原DataFrame:df['产品平均销售额'] = df.groupby('产品类别')['销售额'].transform('mean')
问:
transform()和agg()有什么区别?
答:agg()返回的是组级别的结果(每组一行),而transform()返回的是与原始DataFrame形状相同的结果(每行对应其组的计算结果),用transform计算每个用户的订单金额占其组内的百分比非常方便。
常见问题与解答(FAQ)
Q1:如何同时按多个列分组,且部分列用不同聚合函数?
result = df.groupby(['部门', '季度']).agg({
'销售额': 'sum',
'成本': 'mean',
'用户ID': 'count'
})
Q2:分组后数据太多,如何只查看前几行?
for name, group in df.groupby('部门'):
print(name)
print(group.head(2)) # 输出每个组的前两行
Q3:聚合结果中NaN值如何处理?
可以在聚合前使用dropna=False保留NaN分组,或用fillna()填充:
df.groupby('某些列', dropna=False)['销售额'].sum().fillna(0)
Q4:如何按时间窗口聚合(如每周、每月)?
使用pd.Grouper或resample:
# 按周聚合
weekly = df.set_index('日期').resample('W')['销售额'].sum()
Q5:聚合后的数据如何导出为Excel?
result.to_excel('聚合结果.xlsx', index=False)
掌握聚合,开启数据分析高效之路
数据聚合是数据分析师最常使用的技能之一,通过本文的案例,你学习了:
- 使用
groupby()进行分组和基础聚合 - 用
agg()同时执行多个统计函数 - 高级技巧如自定义函数、性能优化
- 常见问题的解决方案
下一步练习建议:
找一个真实的数据集(如Kaggle上的销售数据),尝试:
- 按地区、月份汇总销售额
- 计算每个用户的复购率(通过分组计数)
- 将聚合结果绘制成热力图或柱状图
掌握Pandas的数据聚合,意味着你能够从海量的原始数据中快速提炼出业务洞察。记住:一个高效的聚合操作,往往胜过十次低效的手工筛选,希望本文能帮你掌握这个核心技能,在数据分析之路上更进一步。
本文参考了Pandas官方文档、Stack Overflow社区问答及多个数据分析实战案例,内容经过综合整理与伪原创处理,以确保符合搜索引擎优化要求。