如何在两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}])
期望输出
| name | goals | minutes |
|---|---|---|
| Ben | 2 | 178 |
| Bob | 1 | 64 |
| Kevin | 2 | 93 |
尝试的代码
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']]
原代码问题说明
- 鲁棒性不足:若df2中存在多个相同
name的行,df2[df2['name'] == str(row['name'])].index.values会返回数组,强行转int会报错 - 效率低下:
iterrows()循环遍历行的方式在数据量大时性能很差,远不如pandas原生的向量化操作
内容的提问来源于stack exchange,提问作者STOWE
相关产品推荐
相关产品推荐

