DC娱乐网

Pandas GroupBy 的 10 个实用技巧

很多人把 groupby 理解成单纯的求和、计数这类操作,比如说算算总收入、数数用户量,然后就没了。实际上它的应用场景要

很多人把 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、transform

df["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