如何在Pandas DataFrame中统计重复行、去重并添加计数列?
解决分组统计重复次数同时保留其他列的问题
针对你的需求,这里有几种实用方案,能在统计重复次数(Quantity列)的同时保留Category、Brand_ID等其他列:
方案1:用transform直接在原DataFrame添加计数
先给原DataFrame添加全为1的Quantity列,然后用transform方法计算每组的总和,这样所有列都会保留,且每一行都会显示对应组的重复次数:
# 先添加全1的Quantity列 df['Quantity'] = 1 # 按Date和Product_ID分组,计算每组的Quantity总和并赋值回原列 df['Quantity'] = df.groupby(['Date', 'Product_ID'])['Quantity'].transform('sum')
这种方法会保留所有原始行,适合需要保留每条记录但同时显示对应组计数的场景。
方案2:分组聚合时指定其他列的保留规则
如果只需要每组保留一行(去重后),可以在agg方法里同时指定Quantity的求和规则,以及其他列的取值规则(比如取组内第一个值,前提是同一组内这些列的值一致):
df['Quantity'] = 1 # 分组聚合,指定各列的处理方式 result_df = df.groupby(['Date', 'Product_ID'], as_index=False).agg( Quantity=('Quantity', 'sum'), Category=('Category', 'first'), Brand_ID=('Brand_ID', 'first') )
如果列比较多,可以用字典推导简化:
agg_dict = {'Quantity': 'sum'} # 给其他列都设置取第一个值的规则 for col in df.columns: if col not in ['Date', 'Product_ID', 'Quantity']: agg_dict[col] = 'first' result_df = df.groupby(['Date', 'Product_ID'], as_index=False).agg(agg_dict)
方案3:先统计计数再合并回原DataFrame
先单独统计每组的重复次数,再通过merge合并回原DataFrame,最后去重:
# 统计每组的重复次数 count_df = df.groupby(['Date', 'Product_ID']).size().reset_index(name='Quantity') # 合并回原DataFrame result_df = df.merge(count_df, on=['Date', 'Product_ID']).drop_duplicates(subset=['Date', 'Product_ID'])
这种方法不需要先添加全1的Quantity列,直接用size()统计次数。
注意事项
如果同一(Date, Product_ID)组内的Category、Brand_ID等列存在不同值,需要先确认业务规则(比如取哪个值),再选择对应的聚合方式(first/last/max等),或者先清洗数据确保组内这些列的值一致。
内容的提问来源于stack exchange,提问作者Reuben Blaff
相关产品推荐
相关产品推荐

