Python中DataFrame重复行保留首行并对指定列求和的实现
解决方案
你需要的需求可以通过pandas的groupby()结合聚合操作直接实现,无需依赖pd.duplicated(),具体代码如下:
import pandas as pd # 初始化示例DataFrame df = pd.DataFrame({ 'brand': ['Yum Yum', 'Yum Yum', 'Indomie', 'Indomie', 'Indomie'], 'style': ['cup', 'cup', 'cup', 'pack', 'pack'], 'rating': [4, 4, 3.5, 15, 5] }) # 核心操作:按brand+style分组,对rating求和,保留分组键为普通列 result = df.groupby(['brand', 'style'], as_index=False)['rating'].sum()
代码解释
groupby(['brand', 'style']):以brand和style作为分组依据,将所有同品牌同包装类型的行归为一组,这正好对应你要识别的"重复行组"as_index=False:确保分组键(brand和style)作为普通数据列保留,而非转为结果的索引['rating'].sum():仅对rating列执行求和聚合,分组键列会自动保留每组的唯一值
运行代码后得到的结果完全符合你的期望:
brand style rating 0 Yum Yum cup 8.0 1 Indomie cup 3.5 2 Indomie pack 20.0
备选方案(基于pd.duplicated()的思路)
如果一定要用pd.duplicated()实现(效率低于直接groupby),可以按以下步骤操作:
# 标记每组的首行(非重复行) non_duplicate_mask = ~df.duplicated(subset=['brand', 'style']) # 提取每组首行的基础信息 base_df = df[non_duplicate_mask].copy() # 按分组对rating求和 summed_ratings = df.groupby(['brand', 'style'])['rating'].sum().reset_index(drop=True) # 替换base_df中的rating为求和后的值 base_df['rating'] = summed_ratings # 重置索引 final_result = base_df.reset_index(drop=True)
内容的提问来源于stack exchange,提问作者user1766875
相关产品推荐
相关产品推荐

