You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对DataFrame多列执行GroupBy分组及自定义聚合操作

多列分组实现季度数据中4的占比统计

问题背景

现有如下结构的DataFrame:

Team Division   Q1   Q2   Q3   Q4
0     Flames  Pacific  4.0  1.0  3.0  1.0
1     Flames  Pacific  4.0  1.0  2.0  2.0
2     Oilers  Pacific  3.0  1.0  1.0  3.0
3    Canucks  Pacific  2.0  NaN  4.0  2.0
4   Senators  Eastern  1.0  4.0  4.0  3.0
5      Leats  Eastern  4.0  3.0  4.0  2.0
6      Leats  Eastern  NaN  4.0  4.0  4.0
7    Canucks  Pacific  2.0  2.0  2.0  3.0
8     Oilers  Pacific  3.0  1.0  NaN  4.0
9     Flames  Pacific  3.0  4.0  4.0  3.0
10    Oilers  Pacific  2.0  3.0  1.0  4.0
11    Oilers  Pacific  4.0  NaN  2.0  1.0
12  Senators  Eastern  4.0  3.0  3.0  3.0
13     Leats  Eastern  2.0  4.0  4.0  NaN

需求是按Team和Division列(未来可扩展其他列)分组,对Q1-Q4列统计值为4的数量占该列有效数据量的比例。原代码仅按Team分组,需修改实现多列分组。

原代码:

grouped = (df.filter(like='Q').groupby(df['Team'])
             .agg(lambda x: x.eq(4).sum()/x.count())
          )
print(grouped)

修改方案

只需将groupby的分组键从单一列改为列名列表即可,未来扩展分组列时直接在列表中添加对应列名:

方式一:传入DataFrame列对象列表

grouped = (df.filter(like='Q').groupby([df['Team'], df['Division']])
             .agg(lambda x: x.eq(4).sum()/x.count())
          )
print(grouped)

方式二:传入列名字符串列表(推荐,可读性更强)

grouped = (df.filter(like='Q').groupby(['Team', 'Division'])
             .agg(lambda x: x.eq(4).sum()/x.count())
          )
print(grouped)

说明

  • groupby支持传入列名列表作为分组依据,会按照多列的组合值进行分组;
  • 聚合逻辑保持不变:lambda x: x.eq(4).sum()/x.count()会对每个Q列单独计算,值为4的行数除以该列非NaN的有效行数,得到占比;
  • 后续需要添加更多分组列时,直接在groupby的列表中追加列名即可,无需修改聚合逻辑。

内容的提问来源于stack exchange,提问作者obi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 06:13:37