Pandas 如果第 1 列未产生匹配项,则合并第 2 列

Pandas merge on column 2 if column 1 did not produce a match

所以我有两个 table 想要合并。但是,第二个 table 中的列引用了第一个 table 中的两列,例如:

Table 1 python:

table1 = pd.DataFrame({
    'Key1': ['Value1', 'Value2', 'Value3'],
    'Key2': ['Apples', 'Pears', 'Oranges'],
    'Text': ['Hello', 'World', '!'],
    'Values': [5, 8, 12],
    })

Table 1:

╔════════╦═════════╦═══════╦════════╗
║  Key1  ║  Key2   ║ Text  ║ Values ║
╠════════╬═════════╬═══════╬════════╣
║ Value1 ║ Apples  ║ Hello ║      5 ║
║ Value2 ║ Pears   ║ World ║      8 ║
║ Value3 ║ Oranges ║ !     ║     12 ║
╚════════╩═════════╩═══════╩════════╝

Table 2 python:

table2 = pd.DataFrame({'Key1_Key2': ['Value2', 'Apples', 'Oranges'],
                          'Value_to_Extract': ['Value 123', 'Value 88',
                          'Value 99']})

Table 2:

╔═══════════╦══════════════════╗
║ Key1_Key2 ║ Value_to_Extract ║
╠═══════════╬══════════════════╣
║ Value2    ║ Value 123        ║
║ Apples    ║ Value 88         ║
║ Oranges   ║ Value 99         ║
╚═══════════╩══════════════════╝

我首先想基于 Key1 值进行合并,只有在失败时才基于 Key2 值进行合并。它应该是完全匹配的,所以我不打算连接 Key1 和 Key2 然后搜索子字符串,因为如果有看起来相似的值(例如 'Apples' 和 'Apple'),那么它会崩溃浩劫

结果应如下所示:

╔════════╦═════════╦═══════╦════════╦══════════════════╗
║  Key1  ║  Key2   ║ Text  ║ Values ║ Value_To_Extract ║
╠════════╬═════════╬═══════╬════════╬══════════════════╣
║ Value1 ║ Apples  ║ Hello ║      5 ║ Value 88         ║
║ Value2 ║ Pears   ║ World ║      8 ║ Value 123        ║
║ Value3 ║ Oranges ║ !     ║     12 ║ Value 99         ║
╚════════╩═════════╩═══════╩════════╩══════════════════╝

您应该按优先顺序执行两个 merge independently, then combine_first 以仅在第一次合并失败时填充缺失值:

m1 = table1.merge(table2, left_on='Key1', right_on='Key1_Key2', how='left')
m2 = table1.merge(table2, left_on='Key2', right_on='Key1_Key2', how='left')

                    # uncomment to remove merge column
m1.combine_first(m2)#.drop(columns='Key1_Key2') 

输出:

     Key1     Key2   Text  Values Key1_Key2 Value_to_Extract
0  Value1   Apples  Hello       5    Apples         Value 88
1  Value2    Pears  World       8    Value2        Value 123
2  Value3  Oranges      !      12   Oranges         Value 99`