如何在Pandas中添加排除自身的col_1&col_2重复行计数新列
解决Pandas添加分组计数列(排除当前行)的问题
问题重现
你有如下DataFrame:
col_1 col_2 6 A 2 A 5 B 3 C 5 C 3 B 6 A 6 A 2 B 2 C 5 A 5 B
需要新增col_new列,统计与当前行col_1和col_2组合完全相同的行数(排除当前行),期望输出:
col_1 col_2 col_new 6 A 2 2 A 0 5 B 1 3 C 0 5 C 0 3 B 0 6 A 2 6 A 2 2 B 0 2 C 0 5 A 0 5 B 1
你尝试的代码df['col_new'] = df.groupby(['col_1', 'col_2']).count()报错:TypeError: incompatible index of inserted column with frame index。
错误原因
groupby(['col_1', 'col_2']).count()返回的是分组聚合后的结果,它的索引是(col_1, col_2)的组合,和原DataFrame的默认整数索引不匹配,直接赋值自然会出现索引兼容问题。
正确解决方案
使用groupby.transform('size')来实现,它会将分组的统计结果广播回原DataFrame的每一行,保证索引匹配,最后减1排除当前行:
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'col_1': [6,2,5,3,5,3,6,6,2,2,5,5], 'col_2': ['A','A','B','C','C','B','A','A','B','C','A','B'] }) # 添加col_new列 df['col_new'] = df.groupby(['col_1', 'col_2'])['col_1'].transform('size') - 1
代码解释
groupby(['col_1', 'col_2']):按col_1和col_2的组合分组.transform('size'):计算每个分组的总行数,并将结果映射到原DataFrame的对应行上(比如所有(6,A)的行都会得到3)- 1:减去当前行本身,得到排除自身后的同组合行数
运行后得到的结果完全符合你的期望。
内容的提问来源于stack exchange,提问作者Apook
相关产品推荐
相关产品推荐

