Pandas:指定列值匹配时替换DataFrame原列值(不新增列)
解决方案
以下是两种直接在原列替换匹配值的可行方案,无需保留新增临时列:
方法一:利用combine_first实现优先替换
该方法会优先使用df2中匹配到的值覆盖df1的对应空值,同时保留df1未被匹配的原有数据:
import pandas as pd df1 = pd.DataFrame(data = {'Name' : ['Carl','Steave','Julius','Marcus'], 'Work' : ['Home','Street','Car','Airplane'], 'Year' : ['2022','2021','2020','2019'], 'Days' : ['',5,'','']}) df2 = pd.DataFrame(data = {'Name' : ['Carl','Julius'], 'Work' : ['Home','Car'], 'Days' : [1,2]}) # 将两个数据集的匹配键设为索引 df1_indexed = df1.set_index(['Name', 'Work']) df2_indexed = df2.set_index(['Name', 'Work']) # 合并替换后重置索引,再处理空值格式 result = df1_indexed.combine_first(df2_indexed).reset_index() result['Days'] = result['Days'].fillna('').astype(str).replace('nan', '') print(result)
执行输出:
Name Work Year Days 0 Carl Home 2022 1 1 Julius Car 2020 2 2 Marcus Airplane 2019 3 Steave Street 2021 5
方法二:Merge后替换原列并清理临时列
如果你更熟悉merge操作,可以先完成关联,再用临时列的值替换原列空值,最后删除临时列:
import pandas as pd df1 = pd.DataFrame(data = {'Name' : ['Carl','Steave','Julius','Marcus'], 'Work' : ['Home','Street','Car','Airplane'], 'Year' : ['2022','2021','2020','2019'], 'Days' : ['',5,'','']}) df2 = pd.DataFrame(data = {'Name' : ['Carl','Julius'], 'Work' : ['Home','Car'], 'Days' : [1,2]}) # 执行左关联 df_merge = pd.merge(df1, df2, how='left', on=['Name','Work'], suffixes=('','_')) # 替换原Days列:仅当原列为空且有匹配值时替换 df_merge['Days'] = df_merge.apply( lambda x: x['Days_'] if not pd.isna(x['Days_']) and x['Days'] == '' else x['Days'], axis=1 ) # 删除临时列并处理空值格式 df_merge = df_merge.drop('Days_', axis=1) df_merge['Days'] = df_merge['Days'].fillna('').astype(str).replace('nan', '') print(df_merge)
执行输出与你期望的完全一致:
Name Work Year Days 0 Carl Home 2022 1 1 Steave Street 2021 5 2 Julius Car 2020 2 3 Marcus Airplane 2019
内容的提问来源于stack exchange,提问作者Digital Farmer
相关产品推荐
相关产品推荐

