如何按ID分组对DataFrame中重复Color的Amount值求和并去重
同一ID下相同Color的Amount求和方案
问题场景
我有如下结构的DataFrame,其中Color为字符类型,Amount为数值类型。存在同一ID下重复的Color记录,对应不同的Amount值,需要将同一ID下相同Color的Amount求和,保留唯一的Color记录(不是对整列求和)。
原始DataFrame:
Color Amount ID [1] Purple 45 566 [2] Blue 56 566 [3] Blue 53 566 [4] Yellow 68 566 [5] Green 76 566 [6] Purple 93 789 [7] Purple 35 789 [8] Blue 56 789 [9] Yellow 37 789
期望结果:
Color Amount ID [1] Purple 45 566 [2] Blue 109 566 [4] Yellow 68 566 [5] Green 76 566 [6] Purple 128 789 [8] Blue 56 789 [9] Yellow 37 789
解决方案
用Pandas的groupby方法按ID和Color分组,对Amount字段求和即可。如果需要保持原始数据中Color的出现顺序,可以额外处理排序逻辑。
代码实现
import pandas as pd # 构造原始DataFrame df = pd.DataFrame({ 'Color': ['Purple', 'Blue', 'Blue', 'Yellow', 'Green', 'Purple', 'Purple', 'Blue', 'Yellow'], 'Amount': [45, 56, 53, 68, 76, 93, 35, 56, 37], 'ID': [566, 566, 566, 566, 566, 789, 789, 789, 789] }) # 核心:按ID和Color分组,对Amount求和 summed_df = df.groupby(['ID', 'Color'], as_index=False)['Amount'].sum() # 保持原始Color出现顺序(可选,若不在意顺序可跳过) # 提取原始数据中每个ID下的Color唯一顺序 original_order = df.drop_duplicates(['ID', 'Color']).sort_values('ID')[['ID', 'Color']] # 合并结果以匹配原始顺序 final_df = pd.merge(original_order, summed_df, on=['ID', 'Color']) print(final_df)
输出结果
Color Amount ID 0 Purple 45 566 1 Blue 109 566 2 Yellow 68 566 3 Green 76 566 4 Purple 128 789 5 Blue 56 789 6 Yellow 37 789
说明
groupby(['ID', 'Color'])确保只对同一ID下的相同Color进行分组,避免跨ID合并。as_index=False让分组后的ID和Color保持为普通列,而非多层索引。- 额外的顺序处理步骤是为了和原始数据中Color的出现顺序一致,若不需要严格匹配顺序,直接使用
summed_df即可。
内容的提问来源于stack exchange,提问作者Ophelia Hanson
相关产品推荐
相关产品推荐

