如何在不折叠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会是这样(保留所有原列,新增计数列):
| A | B | C | D | E | group_count |
|---|---|---|---|---|---|
| 1 | x | True | 10 | a | 2 |
| 1 | x | True | 20 | b | 2 |
| 2 | y | False | 30 | c | 3 |
| 2 | y | False | 40 | d | 3 |
| 2 | y | False | 50 | e | 3 |
可以看到,A/B/C完全相同的行拥有相同的计数,且原DataFrame的所有列和行数都没有变化,完美解决你的问题!
补充说明
transform()支持多种聚合函数,比如sum()、mean()等,如果之后需要给每行添加分组求和、均值等信息,用法和上面完全一致。- 如果你的
A/B/C列中有缺失值,groupby会自动将缺失值视为一组(即所有A/B/C都为缺失的行会被分到同一组),如果需要排除缺失值,可以先处理df = df.dropna(subset=['A', 'B', 'C'])。
内容的提问来源于stack exchange,提问作者Ethan
相关产品推荐
相关产品推荐

