如何按优先匹配规则从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值:
- 先初始化两个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']
- 按优先级(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时返回NAfillna():按优先级从高到低填充,确保只有高优先级列匹配失败时,才会使用低优先级列的匹配结果,不会生成冗余列
内容的提问来源于stack exchange,提问作者flâneur
相关产品推荐
相关产品推荐

