执行合并已连接列的外部联接

时间:2018-03-10 08:15:25

标签: python pandas dataframe join

我正在两个DataFrame上执行外连接:

df1 = pd.DataFrame({'id':      [1, 2, 3, 4, 5], 
                    'date':    [4, 5, 6, 7, 8],
                    'str':     ['a', 'b', 'c', 'd', 'e']})

df2 = pd.DataFrame({'id':      [1, 2, 3, 4, 6], 
                    'date':    [4, 5, 6, 7, 8],
                    'str':     ['A', 'B', 'C', 'D', 'Q']})

pd.merge(df1, df2, on=["id","date"], how="outer")

这给出了结果

   date  id str_x str_y
0     4   1     a     A
1     5   2     b     B
2     6   3     c     C
3     7   4     d     D
4     8   5     e   NaN
5     8   6   NaN     Q

是否可以执行外连接以使str - 列连接起来?换句话说,如何执行连接以便获取DataFrame

   date  id     str
0     4   1     aA
1     5   2     bB
2     6   3     cC
3     7   4     dD
4     8   5     e
5     8   6     Q

其中所有NaN都已设置为None

2 个答案:

答案 0 :(得分:2)

我认为不是,可能的解决方案是替换NaN并加入:

df = (pd.merge(df1, df2, on=["id","date"], how="outer", suffixes=('','_'))
        .assign(str=lambda x: x['str'].fillna('') + x['str_'].fillna(''))
        .drop('str_', 1))

类似的替代方案:

df = (pd.merge(df1, df2, on=["id","date"], how="outer", suffixes=('','_'))
        .assign(str=lambda x: x.filter(like='str').fillna('').values.sum(axis=1))
        .drop('str_', 1))
print (df)
   date  id str
0     4   1  aA
1     5   2  bB
2     6   3  cC
3     7   4  dD
4     8   5   e
5     8   6   Q

答案 1 :(得分:2)

如果'id', 'date'在每个数据框中都是唯一的,那么您可以设置索引并添加数据帧。

icols = ['date', 'id']
df1.set_index(icols).add(df2.set_index(icols), fill_value='').reset_index()

   date  id str
0     4   1  aA
1     5   2  bB
2     6   3  cC
3     7   4  dD
4     8   5   e
5     8   6   Q