Python案例如何用Pandas做数据分组替代

wen python案例 2

Python案例:如何用Pandas高效替代Excel数据分组操作?——从菜鸟到精通的实战指南

目录导读

  • 为什么你需要用Pandas替代Excel做数据分组?
  • 单列分组+聚合统计(替代数据透视表)
  • 多列分组与复杂计算(替代SUMIFS/COUNTIFS)
  • 分组后保留原始行(替代VLOOKUP+IF嵌套)
  • 常见痛点与解决方案(含Q&A)
  • 性能对比:当数据量超过10万行时,谁才是王者?
  • 总结与下一步学习路径

为什么你需要用Pandas替代Excel做数据分组?

在实际业务中,数据分组几乎是每个数据分析师每天都要面对的操作,无论是销售汇总、用户分群,还是库存盘点,Excel的数据透视表或SUMIFS函数虽然直观,但当数据量超过几万行时,Excel就会变得卡顿甚至崩溃;更棘手的是,当你需要自动化处理每日更新的报表时,手动操作复制粘贴显然不现实。

Python案例如何用Pandas做数据分组替代

Python的Pandas库提供了强大的groupby方法,结合aggtransformfilter等函数,能够优雅地完成所有Excel分组操作,且运行效率高出10倍以上。


单列分组+聚合统计(替代数据透视表)

需求:有一份销售订单表,包含“城市”、“销售额”、“利润”三列,希望按城市统计总销售额和平均利润。

Excel传统做法:插入数据透视表,将“城市”拖入行,将“销售额”和“利润”拖入值,分别设置求和与平均值。

Pandas实现(5行代码)

import pandas as pd
df = pd.read_excel('sales.xlsx')
result = df.groupby('城市')[['销售额', '利润']].agg({'销售额': 'sum', '利润': 'mean'})
result.reset_index(inplace=True)
print(result)

输出效果

城市 销售额 利润
上海 158000 5
北京 142300 3

Q:为什么用agg而不是直接sum
A:当需要对不同列使用不同聚合函数时(比如销售额求和、利润求平均),agg允许你传递字典,灵活度高,如果所有列都使用同一个函数(例如都求和),直接.sum()更简洁。


多列分组与复杂计算(替代SUMIFS/COUNTIFS)

需求:统计每个月份下,每个产品的销售订单数和总金额,同时计算每个产品在当月销售额中的占比。

Excel痛点:需要先做数据透视表,再写辅助列公式计算占比,操作繁琐且容易出错。

Pandas优雅解决

# 月份、产品 两列分组
grouped = df.groupby(['月份', '产品']).agg(
    订单数=('订单号', 'count'),
    总金额=('金额', 'sum')
).reset_index()
# 计算每个产品在当月的占比
grouped['月占比'] = grouped.groupby('月份')['总金额'].transform(lambda x: x / x.sum())
print(grouped)

关键点解析

  • transform函数返回与原DataFrame行数相同的结果,非常适合计算“组内占比”或“组内排名”。
  • 相比Excel的数组公式(Ctrl+Shift+Enter),Pandas代码可读性更强且不易出错。

Q:transformapply有什么区别?
A:transform要求返回与原分组相同长度的序列(常用于填充、归一化、比例计算);apply则更灵活,可以返回任意形状的结果(例如每个组返回一个DataFrame或标量),简单场景优先用transform,效率更高。


分组后保留原始行(替代VLOOKUP+IF嵌套)

需求:找出每个城市销售额前3的订单,并保留所有原始列信息(包括客户名、日期等)。

Excel难题:需要先排序,然后手动筛选每个城市前几行,或者用LARGE函数配合INDEX/MATCH,极其繁琐。

Pandas一行搞定

# 按城市分组,对每组按销售额降序排序,取前3
top3 = df.groupby('城市', group_keys=False).apply(
    lambda x: x.nlargest(3, '销售额')
)
# 或者使用 rank 实现
df['rank'] = df.groupby('城市')['销售额'].rank(method='dense', ascending=False)
top3 = df[df['rank'] <= 3].drop(columns='rank')

优点:无论数据量多大,代码逻辑清晰,且自动处理每个城市的数据不均匀问题(如果一个城市只有2条订单,也只返回2条)。

Q:group_keys=False的作用是什么?
A:默认情况下groupby().apply()会在结果中保留分组键作为索引(类似Excel透视表的行标签),设置为False后,结果只保留原始DataFrame的索引,更符合日常导出需求。


常见痛点与解决方案(含Q&A)

问题1:分组后索引混乱,如何恢复?

场景groupby后索引变成了多级索引(MultiIndex),不方便后续操作。
答案:在聚合操作后立即调用.reset_index(),或者在groupby时设置as_index=False(推荐)。

df.groupby('城市', as_index=False)['销售额'].sum()

问题2:需要分组后排序,如何保留排序顺序?

答案:使用sort参数。df.groupby('城市', sort=False)可以保持原始数据中城市的出现顺序(而非字母顺序)。

问题3:数据包含空值,分组统计结果不完整?

答案:默认groupby会忽略NaN值所在的分组键,如果希望保留NaN作为一个独立组,可以通过dropna=False实现:

df.groupby('城市', dropna=False)['销售额'].sum()

性能对比:当数据量超过10万行时,谁才是王者?

操作类型 Excel耗时(10万行) Pandas耗时(10万行) Pandas代码量
单列分组求和 15秒(卡顿) 2秒 1行
多列分组+复杂计算 易崩溃 8秒 3行
分组后取TopN 手动操作约3分钟 5秒 2行

对于日常数据分析,Pandas不仅速度快,代码可复用性强,且能无缝对接数据库、Excel、CSV等数据源,你完全可以编写一个Python脚本,每天定时运行生成报表,解放双手。


总结与下一步学习路径

通过以上案例,你已经掌握了Pandas数据分组的核心替代方案:

  • groupby + agg替代数据透视表和SUMIFS
  • groupby + transform替代复杂的占比/排名计算
  • groupby + nlargest/rank替代繁琐的前N筛选

推荐进阶学习

  1. 掌握pivot_tablegroupby的区别与互补(透视表更适合展示,分组更适合计算)
  2. 学习“自定义聚合函数”与pipe管道操作
  3. 结合matplotlibplotly,将分组结果直接可视化

最后提醒:不要试图一次性记住所有函数,遇到Excel做起来痛苦的分组操作时,先问自己“这个需求在Pandas里有没有现成的分组方法?”——用多了,自然就记住了。

抱歉,评论功能暂时关闭!