【问题标题】:Merging multiple dataframes on different columns合并不同列上的多个数据框
【发布时间】:2021-05-12 23:08:54
【问题描述】:

使用熊猫 1.2.1

MRE:

df_a = pd.DataFrame({"A":[1,2,3,4], "B":[33, 44, 55, 66]})
df_b = pd.DataFrame({"B":[33, 44,99], "C":["v", "z", "z"]})
df_c = pd.DataFrame({"A":[3,4,77,55], "D":["aa", "bb", "cc", "dd"]})

使用上面创建的三个 dfs 我想将它们全部连接在一起

  1. df_a、df_b 共享列“B”,因此它们加入列“B”
  2. df_a、df_c 共享列“A”,因此它们加入列“A”

我想将 df_b 和 df_c 左连接到 df_a。目前这是我的方法:

merged_df = pd.merge(df_a, df_b, on=["B"], how="left")
merged_df = pd.merge(merged_df, df_c, on=["A"], how="left")

我知道工作正常,但是我不能停下来认为有一种更简单快捷的方法,在使用 reduce 函数在同一列上加入多个 dfs 时有多个问题,但找不到我的问题的解决方案。

【问题讨论】:

    标签: python pandas merge


    【解决方案1】:

    您可以删除on参数,因此它通过DataFrames之间的列名称的交集进行合并:

    merged_df = pd.merge(df_a, df_b, how="left")
    merged_df = pd.merge(merged_df, df_c, how="left")
    

    更动态的是使用reduce,也去掉on参数:

    from functools import reduce
    dfList = [df1, df2, df3]
    df = reduce(lambda df1,df2: pd.merge(df1,df2,how="left"), dfList)
    

    【讨论】:

    • 我添加 col name 的原因是因为可读性,有没有其他方法可以提高可读性?
    • @Ambleu - 嗯,我认为需要你的解决方案,只需将['A'] 删除到AB 类似
    • 你能澄清一下吗?没有完全理解。
    • @Ambleu - 您的解决方案中只有很小的变化,例如merged_df = pd.merge(df_a, df_b, on=["B"], how="left")merged_df = pd.merge(df_a, df_b, on="B", how="left")
    • 谢谢!我很好奇是否有类似的方法来连接列,但是在这种情况下,连接列不能共享相同的名称,在这种情况下,像我的示例这样的代码可能是最干净的?
    猜你喜欢
    • 2019-11-20
    • 2016-11-22
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 2016-11-01
    相关资源
    最近更新 更多