合并DataFrame时对同名行的Integer列求和的实现方法
解决方案
你的需求是按Name列匹配行,对指定的Integer列求和,同时保留仅出现在单个DataFrame中的行,且实际场景存在多列(含字符串、整数类型),需指定仅对目标列执行求和操作。以下是两种可行方法:
方法一:合并后分组(灵活适配多列场景)
这是最通用的方案,支持自定义多列的聚合规则:
- 先合并两个DataFrame:
import pandas as pd df1 = pd.DataFrame({'Integer':(1,1,1,1),'Name':('John','Mary','Jason','Ruth')}) df2 = pd.DataFrame({'Integer':(2,2,2,2,2),'Name':('Rob','Jason','Mary','Mark','Leo')}) # 合并两个DataFrame,忽略原索引 combined_df = pd.concat([df1, df2], ignore_index=True)
- 定义聚合规则:仅对
Integer列求和,其他列(若存在)可根据需求指定保留逻辑(比如取首次出现的值):
# 自定义聚合规则,key为列名,value为聚合方法 agg_rules = { 'Integer': 'sum', # 示例:若有其他列,如字符串列'City'、数值列'Age',可指定保留逻辑 # 'City': 'first', # 'Age': 'first' } # 按Name分组聚合,不将Name设为索引 df3 = combined_df.groupby('Name', as_index=False).agg(agg_rules) # 可选:重置索引并排序,与示例结果顺序对齐 df3 = df3.sort_values(by='Name').reset_index(drop=True) print(df3)
输出结果:
Integer Name 0 3 Jason 1 1 John 2 2 Leo 3 2 Mark 4 3 Mary 5 1 Ruth 6 2 Rob
方法二:外连接合并后求和(适合仅两表单列求和场景)
如果仅需对Integer列求和,也可以用外连接合并后直接计算:
merged = df1.merge(df2, on='Name', how='outer', suffixes=('_df1', '_df2')) # 对两表的Integer列求和,空值补0 merged['Integer'] = merged['Integer_df1'].fillna(0) + merged['Integer_df2'].fillna(0) # 保留目标列并转换数据类型 df3 = merged[['Name', 'Integer']].astype({'Integer': int}).sort_values(by='Name').reset_index(drop=True) print(df3)
补充说明
你提到的pd.concat([df1, df2]).groupby('Name', as_index=False).sum()仅返回共同行的情况,应该是操作失误——该代码实际会包含所有Name(包括仅出现在单个DataFrame的行),只是sum()会对所有数值列执行求和,不符合你“仅指定某列求和”的需求,因此需要用自定义聚合规则的方式替代。
内容的提问来源于stack exchange,提问作者Rafael Paulino
相关产品推荐
相关产品推荐

