You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并DataFrame时对同名行的Integer列求和的实现方法

解决方案

你的需求是按Name列匹配行,对指定的Integer列求和,同时保留仅出现在单个DataFrame中的行,且实际场景存在多列(含字符串、整数类型),需指定仅对目标列执行求和操作。以下是两种可行方法:

方法一:合并后分组(灵活适配多列场景)

这是最通用的方案,支持自定义多列的聚合规则:

  1. 先合并两个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)
  1. 定义聚合规则:仅对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 04:37:31