基于另一DataFrame替换DataFrame列中的值
解决DataFrame中WorkerId的匹配替换问题
问题描述
我有两个DataFrame:
df1 PRA_Kod;WorkerId 1049;9024 0014;60260 0608;10506 20270/9;20270 9511;64473 0639;60264 0767;10509 .. .. .. . .
df2 WorkerId;Day;Time;W 1049;11;u.wyp;WE 1049;14;u.wyp;WE 64454;11;u.wyp;WE 0014;15;u.wyp;WE 64471;12;u.wyp;WE 64471;13;u.wyp;WE 0639;06;u.wyp;WE 0639;01;u.wyp;WE 0639;02;u.wyp;WE 0639;03;u.wyp;WE 64465;04;u.wyp;WE 64465;05;u.wyp;WE ... ... .. .
需求:若df2['WorkerId']的值存在于df1['PRA_Kod']中,则将df2['WorkerId']替换为对应的df1['WorkerId']值。
注:PRA_Kod中的值"20270/9"并非输入错误,这是不同表合并后的结果,部分用户在不同表中有不同索引。
期望输出:
df_result WorkerId;Day;Time;W 9024;11;u.wyp;WE 9024;14;u.wyp;WE 64454;11;u.wyp;WE 60260;15;u.wyp;WE 64471;12;u.wyp;WE 64471;13;u.wyp;WE 60264;06;u.wyp;WE 60264;01;u.wyp;WE 60264;02;u.wyp;WE 60264;03;u.wyp;WE 64465;04;u.wyp;WE 64465;05;u.wyp;WE ... ... .. .
我尝试的代码抛出了ValueError: Can only compare identically-labeled Series objects.错误:
df_result.loc[ df2['WorkerId'].eq == df1['PRA_Kod'].eq, df2['WorkerId'] ] = df1['WorkerId']
解决方案
你报错的原因是直接对两个长度、索引都不一致的Series用eq比较,无法完成匹配。正确做法是先构建映射关系,再批量替换,以下是两种简洁的实现方式:
方法一:使用字典映射 + map
- 从df1生成
PRA_Kod到WorkerId的映射字典:
pra_worker_map = df1.set_index('PRA_Kod')['WorkerId'].to_dict()
- 对df2的WorkerId进行替换,未匹配的值保留原样:
df2['WorkerId'] = df2['WorkerId'].map(pra_worker_map).fillna(df2['WorkerId'])
方法二:直接使用replace
replace方法可以直接接收字典作为参数,自动替换匹配的键,未匹配的值保持不变,代码更简洁:
pra_worker_map = df1.set_index('PRA_Kod')['WorkerId'].to_dict() df2['WorkerId'] = df2['WorkerId'].replace(pra_worker_map)
代码说明
set_index('PRA_Kod')['WorkerId'].to_dict():将df1的PRA_Kod作为键,对应的WorkerId作为值生成字典,实现快速查找匹配。map(pra_worker_map):遍历df2的每个WorkerId,用字典中的值替换匹配项,未匹配项会变为NaN,后续用fillna还原原值。replace(pra_worker_map):直接替换字典中存在的键值对,无需额外处理空值,逻辑更直观。
处理完成后,df2就是你需要的df_result。
内容的提问来源于stack exchange,提问作者benek
相关产品推荐
相关产品推荐

