很多人把 groupby 理解成单纯的求和、计数这类操作,比如说算算总收入、数数用户量,然后就没了。实际上它的应用场景要广得多:计算组内特征、数据标准化、构造滚动指标、合并不同维度的统计结果,甚至处理一些复杂的嵌套数据结构。

所以本文将介绍10个实际工作中比较有用的技巧,文章的代码都是可以直接拿来用。
1、一次性应用多个聚合函数import pandas as pd df = pd.DataFrame({ "team": ["A", "A", "B", "B"], "score": [10, 15, 7, 20] }) result = df.groupby("team").agg({ "score": ["sum", "mean", "max"] }) print(result)#### score sum mean max team A 25 12.5 15 B 27 13.5 20
2、聚合后对结果进行命名result = df.groupby("team").agg( total_score=("score", "sum"), avg_score=("score", "mean"), max_score=("score", "max") ) print(result)### total_score avg_score max_score team A 25 12.5 15 B 27 13.5 20
3、transformdf["team_avg"] = df.groupby("team")["score"].transform("mean") print(df)
每一行现在都带上了所属组的均值,这在特征工程里特别常用。
team score team_avg 0 A 10 12.5 1 A 15 12.5 2 B 7 13.5 3 B 20 13.5
4、组内累积计算df["cumulative_score"] = ( df.groupby("team")["score"] .transform(lambda s: s.cumsum()) ) print(df)
累积和会在每个分组内部重新开始计算。
team score team_avg cumulative_score 0 A 10 12.5 10 1 A 15 12.5 25 2 B 7 13.5 7 3 B 20 13.5 27
5、自定义聚合逻辑def score_range(s): return s.max() - s.min() result = df.groupby("team")["score"].agg(score_range) print(result)
一些复杂的业务指标基本都可以用这种方式实现。
team A 5 B 13 Name: score, dtype: int64
6、统计唯一值df2 = pd.DataFrame({ "team": ["A", "A", "B", "B", "B"], "member": ["x", "y", "x", "x", "z"] }) unique_counts = df2.groupby("team")["member"].nunique() unique_sets = df2.groupby("team")["member"].apply(set) print(unique_counts) print(unique_sets)#### team A 2 B 2 Name: member, dtype: int64 team A {x, y} B {x, z} Name: member, dtype: object
7、按类别分组的正确姿势df2["team"] = df2["team"].astype("category") result = df2.groupby("team", observed=False)["member"].count() print(result)
做报表的时候有些预定义的类别即使没数据也需要显示出来,这时候这个参数就派上用场了。
team A 2 B 3 Name: member, dtype: int64
8、多层级分组df3 = pd.DataFrame({ "team": ["A", "A", "B", "B"], "year": [2023, 2024, 2023, 2024], "score": [10, 15, 7, 20] }) result = df3.groupby(["team", "year"])["score"].sum() print(result)
队列分析或者按时间切片的场景基本就是这个结构。
team year A 2023 10 2024 15 B 2023 7 2024 20 Name: score, dtype: int64
9、扁平化输出flat = df3.groupby("team", as_index=False).agg({"score": "sum"}) print(flat)
对接 API 或者导入 BI 工具时,扁平结构往往更方便。
team score 0 A 25 1 B 27
10、结合透视表使用pivot = pd.pivot_table( df3, values="score", index="team", columns="year", aggfunc="sum" ) print(pivot)
这种交叉统计的表格在做汇总分析时经常用到。
year 2023 2024 team A 10 15 B 7 20
总结groupby 的功能远比表面看起来丰富。agg 处理多指标汇总,transform 生成组级特征,MultiIndex 分组配合 pivot_table 可以快速构建复杂的数据视图。熟练掌握这些用法之后,很多数据处理任务的代码量能减少不少。
多指标统计用 agg,命名聚合让代码更清晰,组内特征计算靠 transform,业务逻辑封装成自定义函数,多维度报表用 MultiIndex 和透视表组合。
https://avoid.overfit.cn/post/da6bdf53716948b7bd26eddc31ea94a4