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

如何高效基于另一个数据集的值修改目标数据集的数值

问题描述

现有两个DataFrame:
df1结构如下:

ID  Score
 A     NA
 A     NA
 B     NA
 B     NA
 B     NA
 B     NA
 C     NA
 C     NA

df2结构如下:

Name Score
   A    70
   B    54
   C    99

需要得到df3,要求完全保留df1的行结构(A、B、C的出现次数不变),把对应ID的Score从df2中填充进去,最终效果:

ID  Score
 A     70
 A     70
 B     54
 B     54
 B     54
 B     54
 C     99
 C     99

原本用for循环遍历df1查找对应值,但数据集行数极多,效率太低,需要高效实现。

高效解决方案

方法1:用map()快速映射

先把df2转换成ID对应Score的字典,再用df1的ID列直接映射填充,全程矢量化操作,效率远超循环:

import pandas as pd

# 构建示例数据(实际使用时替换成你的数据集)
df1 = pd.DataFrame({'ID': ['A', 'A', 'B', 'B', 'B', 'B', 'C', 'C'], 'Score': [pd.NA]*8})
df2 = pd.DataFrame({'Name': ['A', 'B', 'C'], 'Score': [70, 54, 99]})

# 把df2转成字典:键是Name,值是对应的Score
score_dict = df2.set_index('Name')['Score'].to_dict()

# 用ID列映射字典,直接替换Score列
df1['Score'] = df1['ID'].map(score_dict)

# 此时df1就是你要的df3
print(df1)

方法2:用merge()左连接匹配

通过左连接保留df1的所有行,自动匹配对应ID的Score值,同样高效:

# 左连接,根据ID和Name匹配,保留df1的所有行
df3 = df1.merge(df2, left_on='ID', right_on='Name', how='left')
# 清理列:删除多余的Name列,把合并后的Score_y重命名为Score
df3 = df3.drop(columns=['Name']).rename(columns={'Score_y': 'Score'})

print(df3)

内容的提问来源于stack exchange,提问作者TIC-FLY

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 12:14:55