合并python中的两个表(使用pandas),其中链接取决于唯一性

时间:2016-11-02 15:27:41

标签: python pandas merge

假设我有两张桌子

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_tablesecond_table的外部合并。请注意,第二个表基于三个键不是唯一的,但第一个表是。因此,当key2在第一个表中唯一时,key3key1不是必需的。同样,当前两个键组合时唯一时,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

1 个答案:

答案 0 :(得分:1)

我们的想法是首先合并key1上的数据框,然后用{1}}填充第一个表中的相应值,然后在值不同时删除行,最后再次合并第一个表获取剩余的行(NaN)。

value_second=NaN