匹配DataFrame同名记录并累加Score值的实现方案
问题描述
我有以下两个DataFrame:
DF1
| Name | Age | Score |
|---|---|---|
| A | 20 | 55 |
| B | 21 | 60 |
| C | 22 | 20 |
| D | 23 | 25 |
| E | 24 | 30 |
DF2(所有Name均存在于DF1中,DF1的Name字段唯一)
| Name | Age | Score |
|---|---|---|
| A | 20 | 20 |
| D | 23 | 40 |
| E | 24 | 80 |
需要将DF2中每条记录的Score累加到DF1对应Name的Score上,最终得到如下结果:
目标结果
| Name | Age | Score |
|---|---|---|
| A | 20 | 75 |
| B | 21 | 60 |
| C | 22 | 20 |
| D | 23 | 65 |
| E | 24 | 110 |
解决方案
方法1:合并后累加
通过merge将两个DataFrame按Name关联,再对Score列求和:
import pandas as pd # 构造示例数据 df1 = pd.DataFrame({ 'Name': ['A', 'B', 'C', 'D', 'E'], 'Age': [20, 21, 22, 23, 24], 'Score': [55, 60, 20, 25, 30] }) df2 = pd.DataFrame({ 'Name': ['A', 'D', 'E'], 'Age': [20, 23, 24], 'Score': [20, 40, 80] }) # 合并Score列,左连接保留DF1所有记录 merged = df1.merge(df2[['Name', 'Score']], on='Name', how='left', suffixes=('', '_df2')) # 累加Score,未匹配到的记录加0 merged['Score'] = merged['Score'] + merged['Score_df2'].fillna(0) # 提取目标列 result = merged[['Name', 'Age', 'Score']] print(result)
方法2:字典映射累加
将DF2的Score转为字典,通过map快速匹配并累加:
import pandas as pd df1 = pd.DataFrame({ 'Name': ['A', 'B', 'C', 'D', 'E'], 'Age': [20, 21, 22, 23, 24], 'Score': [55, 60, 20, 25, 30] }) df2 = pd.DataFrame({ 'Name': ['A', 'D', 'E'], 'Age': [20, 23, 24], 'Score': [20, 40, 80] }) # 构建Name到Score的映射字典 score_dict = df2.set_index('Name')['Score'].to_dict() # 累加Score,不存在的Name加0 df1['Score'] += df1['Name'].map(score_dict).fillna(0) print(df1)
方法3:add方法批量更新
利用pandas的add方法,按索引匹配并累加,效率更高:
import pandas as pd df1 = pd.DataFrame({ 'Name': ['A', 'B', 'C', 'D', 'E'], 'Age': [20, 21, 22, 23, 24], 'Score': [55, 60, 20, 25, 30] }) df2 = pd.DataFrame({ 'Name': ['A', 'D', 'E'], 'Age': [20, 23, 24], 'Score': [20, 40, 80] }) # 复制原数据避免修改源DF result = df1.copy() # 将DF2转为以Name为索引的Series df2_score = df2.set_index('Name')['Score'] # 批量累加Score,未匹配项填充0 result['Score'] = result['Score'].add(df2_score, fill_value=0) print(result)
以上三种方法均能实现需求,其中方法2和3无需额外合并操作,处理大数据量时效率更优。
内容的提问来源于stack exchange,提问作者ancalleja
相关产品推荐
相关产品推荐

