【问题标题】:Dataframe Left Merge with Matching Keys In Different Columns数据框左合并与不同列中的匹配键
【发布时间】:2020-11-21 13:51:57
【问题描述】:

我必须合并两个DataFrame,并使用左连接 - 下图。

问题是匹配键分布在 3 列中。为了使挑战更加复杂,一些行(#4)将有两次相同的匹配键!有人建议我使用 Melt,但它只适用于 Right Join。

最好的方法是什么?

将熊猫导入为 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)

【问题讨论】:

    标签: python pandas dataframe merge


    【解决方案1】:

    让我们尝试stack 重塑df1 然后map 与来自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
    

    【讨论】:

    • 完美运行!请问这个方法有什么限制吗?
    • 如果 DF1 有 3 个键但也有非键列怎么办。我如何应用堆栈? @shubham-sharma
    • @denpy 太好了!我不认为有任何限制,除非df2 包含重复的键。但在这种情况下,您可以使用drop_duplicates,这将正常工作。
    • @denpy 如果数据框包含非关键列,您可以在使用 stack 之前使用 df1.filter(like='key') 过滤所需的 key
    • @denpy 编码快乐 :)
    【解决方案2】:

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

    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')
    

    【讨论】:

      猜你喜欢
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      • 2021-07-22
      • 1970-01-01
      • 2022-11-07
      相关资源
      最近更新 更多