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`
所以我有两个 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`