Pandas分组后保留所有行列并添加分组计数列的问题及替代方案
解决方法
首先,你之前用transform('count')没得到预期结果,大概率是因为count会忽略缺失值,换成transform('size')更可靠——它会统计每组的总行数(不管是否有缺失值)。另外注意你提到的分组列Assoc_ID在给出的DataFrame输出里不存在,是不是把ID1/ID2写错了?以下是几种可行方案:
方案1:用transform+size(最简洁)
假设你实际要分组的是ID1、SRA_2、Prd_Name(如果确实有Assoc_ID列,替换成对应列名即可):
df['Cnt'] = df.groupby(['ID1', 'SRA_2', 'Prd_Name'])['ID1'].transform('size')
方案2:分组统计后左连接
先单独统计每组计数,再通过左连接合并回原DataFrame,确保保留所有行:
# 先统计每组数量 group_counts = df.groupby(['ID1', 'SRA_2', 'Prd_Name']).size().reset_index(name='Cnt') # 左连接合并,保留原表所有行 df = df.merge(group_counts, on=['ID1', 'SRA_2', 'Prd_Name'], how='left')
方案3:用索引映射
先生成分组计数的映射表,再通过索引匹配赋值:
# 生成分组到计数的映射 count_mapping = df.groupby(['ID1', 'SRA_2', 'Prd_Name']).size() # 将原表的分组列设为索引,映射后恢复原索引 df['Cnt'] = df.set_index(['ID1', 'SRA_2', 'Prd_Name']).index.map(count_mapping.get) df = df.reset_index(drop=True)
关键说明
sizevscount:size统计每组的总行数,包含缺失值;count仅统计非NaN的行数,如果你分组列或统计列存在空白/NaN,两者结果会不同,这很可能是你之前失败的原因。
内容的提问来源于stack exchange,提问作者NoobMaster27
相关产品推荐
相关产品推荐

