当两个pandas数据帧包含重复键时,如何使用left join合并两个pandas数据帧?

2024-10-11 16:26:52 发布

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

我有两个Python Pandas数据帧,如下所示:

left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K1', 'K1', 'K1', 'K2'],
                      'key2': ['K0', 'K1', 'K0', 'K0', 'K0', 'K0', 'K1'],
                      'A': ['A0', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6'],
                      'B': ['B0', 'B1', 'B2', 'B3', 'B4', 'B5', 'B6']})

right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                       'key2': ['K0', 'K0', 'K0', 'K0'],
                       'C': ['C0', 'C1', 'C2', 'C3'],
                       'D': ['D0', 'D1', 'D2', 'D3']})
print left
    A   B key1 key2
0  A0  B0   K0   K0
1  A1  B1   K0   K1
2  A2  B2   K1   K0
3  A3  B3   K1   K0
4  A4  B4   K1   K0
5  A5  B5   K1   K0
6  A6  B6   K2   K1

print right
    C   D key1 key2
0  C0  D0   K0   K0
1  C1  D1   K1   K0
2  C2  D2   K1   K0
3  C3  D3   K2   K0

我想在一定条件下合并这两个数据帧:

  1. 我想合并key1和key2上的数据帧。在
  2. 我想要输出数据帧,左边的数据帧中只有行可用。(如果左数据帧的key1和key2在右数据帧的key1和key2中可用,则通过附加列C和D来完成当前行)

我尝试了如下方法:

^{pr2}$

如果我从左边的数据帧中删除重复的条目,那么我也没有得到预期的输出。在

然后,我试图从结果数据框中删除重复的条目,然后得到以下数据框:

result.drop_duplicates(subset = ['A','B','key1','key2'], inplace=True)
print result

     A   B key1 key2    C    D
0   A0  B0   K0   K0   C0   D0
1   A1  B1   K0   K1  NaN  NaN
2   A2  B2   K1   K0   C1   D1
4   A3  B3   K1   K0   C1   D1
6   A4  B4   K1   K0   C1   D1
8   A5  B5   K1   K0   C1   D1
10  A6  B6   K2   K1  NaN  NaN

问题是列C和D包含相同的值,这是因为默认的keep=First行为。我想改变这个行为,这样我就可以得到低于预期的数据帧。在

编辑:

如果left Dataframe的key1和key2在右Dataframe的key1和key2中匹配,则将C和D列追加到该行;如果列C和D已经追加到同一行,则将C和D保留为Nan。在

预期输出:

     A   B key1 key2    C    D
0   A0  B0   K0   K0   C0   D0
1   A1  B1   K0   K1  NaN  NaN
2   A2  B2   K1   K0   C1   D1
3   A3  B3   K1   K0   C2   D2
4   A4  B4   K1   K0   NaN  Nan
5   A5  B5   K1   K0   NaN  Nan
6   A6  B6   K2   K1  NaN  NaN

Tags: 数据a2a1k2k1nana0a3
1条回答
网友
1楼 · 发布于 2024-10-11 16:26:52

不幸的是,你的问题并没有描述你想要达到什么样的目标,因为它对任何有类似问题的人都是有用的。在

实际上,您希望为重复的合并键获得排序合并。在

继续的逻辑方法是add a sequence number使合并的多个键唯一。接下来是一个小的合并。在

left['Order'] = left.groupby(['key1','key2']).cumcount()
right['Order'] = right.groupby(['key1','key2']).cumcount()

result = left.merge(right, how='left', 
                    on=['key1','key2','Order']).drop('Order',axis=1)

相关问题 更多 >

    热门问题