在不同列中匹配键的数据框左合并

3

我必须合并两个 DataFrame,使用左连接 - 具体如下所示。

问题在于匹配键分布在3个列中。为了进一步增加难度,某些行(#4)将两次具有相同的匹配键!我建议使用 Melt,但它仅适用于右连接。

最佳方法是什么?

import pandas as pd

data1 = {'key1' : ['abc','aa','aa','sdf'],
         'key2' : ['aa','efg','aa', 'sdf'],
         'key3' : ['aa','aa','xyz', 'aa']
        }

data2 = {'key': ['abc','efg', 'xyz', 'sdf'], 
        'msg' : ['happy','mad','smile','great']}

df1= pd.DataFrame(data1)
df2= pd.DataFrame(data2)

enter image description here

2个回答

1

让我们尝试使用 stack 来重塑 df1,然后使用来自 df2 的相应 msg 将键映射,最后在 level=0 上进行 groupby 并使用 first 进行聚合:

df1['msg'] = df1.stack().map(df2.set_index('key')['msg']).groupby(level=0).first()

  key1 key2 key3    msg
0  abc   aa   aa  happy
1   aa  efg   aa    mad
2   aa   aa  xyz  smile
3  sdf  sdf   aa  great

运行完美!请问这种方法是否有任何限制? - denpy
如果DF1有3个关键列,但也有非关键列,我该如何应用stack?@shubham-sharma - denpy
@denpy 非常好!我认为除了 df2 包含重复键时可能会有限制外,没有其他限制。但在这种情况下,您可以使用 drop_duplicates,这将正常工作。 - Shubham Sharma
如果数据框包含非键列,您可以在使用“stack”之前使用“df1.filter(like='key')”来过滤所需的“key”列。 - Shubham Sharma
@denpy 祝你编码愉快 :) - Shubham Sharma

0
这样怎么样?您可以重新创建一个临时数据框,其中所有键都在同一列上,进行连接,然后删除任何重复项(并重新合并到第一个数据框):
df1.reset_index(drop=True, inplace=True)

df3 = pd.DataFrame(
  df1[["index", "key1"]].values.tolist()
  + df1[["index", "key2"]].values.tolist()
  + df1[["index", "key3"]].values.tolist(),
  columns=['index', 'key'])
df4 = df3.merge(df2, on="key", how="left")
df4.sort_values('index', inplace=True)
df4.drop_duplicates('index', keep='first')

df = df1.merge(df4[['index', 'msg']], on="index", how='left')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接