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

如何按优先匹配规则从DataFrame多列合并关联数据?

按优先级匹配列合并DataFrame

问题描述

现有两个DataFrame:
第一个DataFrame(主表):

V1 V2 V3  
A  A1 A11  
A  A1 NA   
B  B2 NA    
B  NA NA   
NA NA NA  

第二个DataFrame(映射表):

geo value
A     5
A1    3
A11   1
B     6
B2    7
B21   9

需求是将映射表的value列合并到主表中,匹配规则为优先匹配最精细的列:先尝试用V3匹配geo,若V3为NA则用V2匹配,若V2也为NA则用V1匹配,所有列都为NA时结果为NA,期望输出:

V1 V2 V3  Value
A  A1 A11  1
A  A1 NA   3
B  B2 NA   7  
B  NA NA   6
NA NA NA  NA

之前多次合并会生成冗余的Value.x、Value.y列,希望实现按优先级匹配的合并逻辑。

解决方案

可以通过分步合并+按优先级填充的方式实现,核心思路是先分别用每一列和映射表匹配,再从高优先级到低优先级依次填充NA值:

  1. 先初始化两个DataFrame:
import pandas as pd
import numpy as np

# 主表
df_main = pd.DataFrame({
    'V1': ['A', 'A', 'B', 'B', np.nan],
    'V2': ['A1', 'A1', 'B2', np.nan, np.nan],
    'V3': ['A11', np.nan, np.nan, np.nan, np.nan]
})

# 映射表转成Series,方便后续匹配
df_map = pd.DataFrame({
    'geo': ['A', 'A1', 'A11', 'B', 'B2', 'B21'],
    'value': [5, 3, 1, 6, 7, 9]
}).set_index('geo')['value']
  1. 按优先级(V3 > V2 > V1)依次匹配并填充:
# 先匹配最高优先级的V3
df_main['Value'] = df_main['V3'].map(df_map)
# 用V2的匹配结果填充V3匹配后剩余的NA
df_main['Value'] = df_main['Value'].fillna(df_main['V2'].map(df_map))
# 用V1的匹配结果填充最后剩余的NA
df_main['Value'] = df_main['Value'].fillna(df_main['V1'].map(df_map))

执行后得到的结果与期望输出一致:

V1   V2    V3  Value
0    A   A1   A11    1.0
1    A   A1   NaN    3.0
2    B   B2   NaN    7.0
3    B  NaN   NaN    6.0
4  NaN  NaN   NaN    NaN

逻辑说明

  • map(df_map):将主表列的取值与映射表的geo索引匹配,返回对应的value,不匹配或原列值为NA时返回NA
  • fillna():按优先级从高到低填充,确保只有高优先级列匹配失败时,才会使用低优先级列的匹配结果,不会生成冗余列

内容的提问来源于stack exchange,提问作者flâneur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 12:33:28