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

2024-05-21 05:56:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在两个数据帧上执行外部联接:

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列连接起来?换句话说,如何执行连接以获得数据帧

   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


Tags: 数据iddataframedateonmergenanhow
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

我认为不是,可能的解决方案是替换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

相关问题 更多 >