在R中基于Number列匹配,用另一数据框非NA值覆盖列数据
解决方案(Pandas)
首先注意:df2中的"NA"是字符串,需先转换为Pandas可识别的空值逻辑,再执行覆盖操作。
方法1:合并后用combine_first(适合保留多列场景)
import pandas as pd import numpy as np # 模拟用户数据(实际使用时替换为你的真实数据) df1 = pd.DataFrame({ 'Number': [1,2,3,10,11,4,277,2100], 'Code': ['', '', '', '', 'AMRO', '', '', 'BLPH'] }) df2 = pd.DataFrame({ 'Number': [1,2,3,10,12,4,277,2100], 'Code': ['AMCR', 'AMCR', 'BANO', 'BAEA', 'AMRO', 'NA', 'NA', 'NA'] }) # 将df2中的字符串"NA"转为NaN df2['Code'] = df2['Code'].replace('NA', np.nan) # 按Number左合并,保留df1所有行 merged = df1.merge(df2, on='Number', suffixes=('_df1', '_df2'), how='left') # 优先取df2的非空Code,否则保留df1的Code merged['Code'] = merged['Code_df2'].combine_first(merged['Code_df1']) # 提取目标列得到最终结果 df1_updated = merged[['Number', 'Code']].reset_index(drop=True)
方法2:字典映射更新(高效简洁,适合仅处理Code列)
import pandas as pd # 模拟用户数据 df1 = pd.DataFrame({ 'Number': [1,2,3,10,11,4,277,2100], 'Code': ['', '', '', '', 'AMRO', '', '', 'BLPH'] }) df2 = pd.DataFrame({ 'Number': [1,2,3,10,12,4,277,2100], 'Code': ['AMCR', 'AMCR', 'BANO', 'BAEA', 'AMRO', 'NA', 'NA', 'NA'] }) # 构建Number到有效Code的字典(过滤掉"NA"项) code_map = df2[df2['Code'] != 'NA'].set_index('Number')['Code'].to_dict() # 遍历df1,匹配则替换,否则保留原值 df1['Code'] = df1.apply(lambda row: code_map.get(row['Number'], row['Code']), axis=1)
两种方法均可得到符合预期的结果,可根据实际数据规模和需求选择。
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

