You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 03:31:38