如何高效基于另一个数据集的值修改目标数据集的数值
问题描述
现有两个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
相关产品推荐
相关产品推荐

