Python基于匹配条件用另一DataFrame值替换当前DataFrame列值
问题分析
- 错误1:使用
str.replace()执行子串替换,而非全值匹配。你在遍历到P_Rvr时会先把它替换为7,后续P_Rvr A-T、P_Rvr R两个值里的P_Rvr子串会被提前替换,等遍历到这两个值时,列内的值已经被修改,无法匹配到DF2的原始键,就出现了你实际输出里的7 A-T、7 R错误结果。 - 错误2:替换逻辑和变量作用域错误。每轮外层循环结束后你都会对整列做一次全局替换,
l1和l2只会保留内层循环最后一次匹配到的值,会进一步导致匹配错位、重复替换。 - 错误3:双重循环的实现完全不符合Pandas的向量化操作逻辑,数据量稍大就会严重卡顿,效率极低。
解决方案
直接使用Pandas自带的映射方法实现全值匹配替换,一步即可得到预期结果:
import pandas as pd data1 = [['P_ER SH M', 456 ,'ER SH M'], ['P_ER SH NE' ,823 ,'ER SH NE'], ['P_Rvr' ,346 , 'Rvr'], ['P_Rvr A-T' ,175 ,'Rvr A-T'], ['P_Rvr R', '446', 'Rvr R'], ['P_U ER Act' ,'642' ,'U ER Act']] data2=[['P_U ER Act', '4'], ['P_Rvr R' ,'8'], ['P_Rvr A-T' ,'9'], ['P_Rvr' ,'7'], ['P_ER SH NE', '13'], ['P_ER SH M' ,'3']] PRK_sourceT_sum_df=pd.DataFrame(data1,columns=['19-SOURCE','19-AMOUNT','19-SOURCE_PRK']) Sourcedata_df=pd.DataFrame(data2,columns=['PRK Source Code','Fid seq Num']) # 构造匹配映射字典,同时对键做去首尾空格处理,避免空格导致匹配失败 map_dict = dict(zip( Sourcedata_df['PRK Source Code'].str.strip(), Sourcedata_df['Fid seq Num'].str.strip() )) # 对DF1的19-SOURCE列做全值匹配替换 PRK_sourceT_sum_df['19-SOURCE'] = PRK_sourceT_sum_df['19-SOURCE'].str.strip().map(map_dict) # 输出查看结果 print(PRK_sourceT_sum_df)
内容的提问来源于stack exchange,提问作者goals
相关产品推荐
相关产品推荐

