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

如何在不折叠Pandas DataFrame的前提下实现分组计数并添加至原表?

解决Pandas分组计数并保留原DataFrame结构的问题

嗨,你的需求其实很容易实现!Pandas里的transform()方法就是专门用来解决这种不折叠原DataFrame,同时给每行添加分组统计信息的场景,完全贴合你的要求。

核心思路

普通的groupby().count()会把每组压缩成一行(也就是你说的“折叠DataFrame”),而transform()会将分组后的聚合结果广播回原DataFrame的每一行,保持原有的行数、索引和所有列,只新增你需要的计数列。

具体实现代码

假设你的原DataFrame名为df,需要基于A、B、C三列分组计数,新增列名为group_count,可以用两种简洁的写法:

写法1:用size()直接统计组大小

df['group_count'] = df.groupby(['A', 'B', 'C']).transform('size')

size()会直接计算每组的元素个数,不需要指定具体列,是最直接的方式。

写法2:用count()统计某列非空值(效果等价)

df['group_count'] = df.groupby(['A', 'B', 'C'])['A'].transform('count')

这里选A列只是示例,只要是A/B/C中的任意一列,结果都是一样的——因为同一组内A/B/C完全相同,计数结果就是组的大小。

示例演示

我们构造一个小数据集来验证效果:

import pandas as pd

# 模拟你的9列DataFrame(这里只展示关键列)
data = {
    'A': [1, 1, 2, 2, 2],
    'B': ['x', 'x', 'y', 'y', 'y'],
    'C': [True, True, False, False, False],
    'D': [10, 20, 30, 40, 50],
    'E': ['a', 'b', 'c', 'd', 'e'],
    # 其他4列省略...
}
df = pd.DataFrame(data)

# 添加分组计数列
df['group_count'] = df.groupby(['A', 'B', 'C']).transform('size')

运行后得到的df会是这样(保留所有原列,新增计数列):

ABCDEgroup_count
1xTrue10a2
1xTrue20b2
2yFalse30c3
2yFalse40d3
2yFalse50e3

可以看到,A/B/C完全相同的行拥有相同的计数,且原DataFrame的所有列和行数都没有变化,完美解决你的问题!

补充说明

  • transform()支持多种聚合函数,比如sum()、mean()等,如果之后需要给每行添加分组求和、均值等信息,用法和上面完全一致。
  • 如果你的A/B/C列中有缺失值,groupby会自动将缺失值视为一组(即所有A/B/C都为缺失的行会被分到同一组),如果需要排除缺失值,可以先处理df = df.dropna(subset=['A', 'B', 'C'])。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:27:34