假设我有两张桌子
import pandas as pd
import numpy as np
first_table = pd.DataFrame({'key1': [1, 2, 2, 2, 3, 3],
'key2': ['a', 'a', 'a', 'b', 'a', 'b'],
'key3': ['A', 'A', 'B', 'A', 'A', 'A'],
'value_first': range(6)})
second_table = pd.DataFrame({'key1': [1, 1, 2, 2, 3],
'key2': [np.nan, np.nan, 'a', 'a', 'b'],
'key3': [np.nan, np.nan, 'A', 'B', np.nan],
'value_second': [6, 4, 2, 0, -2]})
所以第一个表看起来像这个
key1 key2 key3 value_first
0 1 a A 0
1 2 a A 1
2 2 a B 2
3 2 b A 3
4 3 a A 4
5 3 b A 5
而第二个表看起来像这样
key1 key2 key3 value_second
0 1 NaN NaN 6
1 1 NaN NaN 4
2 2 a A 2
3 2 a B 0
4 3 b NaN -2
现在我希望基于三个键进行first_table
和second_table
的外部合并。请注意,第二个表基于三个键不是唯一的,但第一个表是。因此,当key2
在第一个表中唯一时,key3
和key1
不是必需的。同样,当前两个键组合时唯一时,key3
不是必需的。
如果第二个表格被精确填写,则合并将由
直接进行pd.merge(first_table, second_table,
how='outer',
left_on=['key1', 'key2', 'key3'],
right_on=['key1', 'key2', 'key3'])
但在这种情况下如何获得所需的结果?期望的结果如下所示
key1 key2 key3 value_first value_second
0 1 a A 0.0 6.0
1 1 a A 0.0 4.0
2 2 a A 1.0 2.0
3 2 a B 2.0 0.0
4 2 b A 3.0 NaN
5 3 a A 4.0 NaN
6 3 b A 5.0 -2.0
答案 0 :(得分:1)
我们的想法是首先合并key1
上的数据框,然后用{1}}填充第一个表中的相应值,然后在值不同时删除行,最后再次合并第一个表获取剩余的行(NaN
)。
value_second=NaN