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

如何在两DataFrame首列值相同时按行累加对应数据?

需求:合并累加DataFrame数据(仅匹配已有name行)

现有两个DataFrame df1和df2,需遍历df2的每一行:

  • 若df1中存在name列值与之相同的行,将df2该行的对应数值数据累加到df1的对应行
  • name列不重复累加,且不新增df1中没有的行(如示例里的Steve不加入,Bob保持原数据)

示例数据

import pandas as pd

df1 = pd.DataFrame([{'name': 'Ben', 'goals': 1, 'minutes': 90},
                    {'name': 'Bob', 'goals': 1, 'minutes': 64},
                    {'name': 'Kevin', 'goals': 1, 'minutes': 90}])

df2 = pd.DataFrame([{'name': 'Ben', 'goals': 1, 'minutes': 88},
                    {'name': 'Kevin', 'goals': 1, 'minutes': 3},
                    {'name': 'Steve', 'goals': 1, 'minutes': 13}])

期望输出

namegoalsminutes
Ben2178
Bob164
Kevin293

尝试的代码

for index, row in df1.iterrows():
    if df2.isin([row['name']]).any().any():
        position = int(df2[df2['name'] == str(row['name'])].index.values)
        df1.iloc[index, 1:] = df1.iloc[index, 1:] + df2.iloc[position, 1:]

优化解决方案

方案1:基于索引的高效累加

利用pandas的索引对齐特性,无需循环,效率更高:

# 将name设为索引,确保只处理df1中存在的行
df1 = df1.set_index('name')
# 对df2的数值列与df1累加,只保留df1原索引的行
df_combined = df2.set_index('name').add(df1, fill_value=0).loc[df1.index]
# 恢复name为列
df1 = df_combined.reset_index()

方案2:合并后分组更新

通过合并匹配name,再对数值列累加:

# 左合并df1和df2,仅保留df1存在的name
merged = df1.merge(df2, on='name', how='left', suffixes=('', '_df2'))
# 累加数值列,缺失值(如Bob无匹配行)用0填充
merged['goals'] = merged['goals'].add(merged['goals_df2'], fill_value=0)
merged['minutes'] = merged['minutes'].add(merged['minutes_df2'], fill_value=0)
# 保留需要的列
df1 = merged[['name', 'goals', 'minutes']]

原代码问题说明

  1. 鲁棒性不足:若df2中存在多个相同name的行,df2[df2['name'] == str(row['name'])].index.values会返回数组,强行转int会报错
  2. 效率低下:iterrows()循环遍历行的方式在数据量大时性能很差,远不如pandas原生的向量化操作

内容的提问来源于stack exchange,提问作者STOWE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 17:01:00