【问题标题】:Merging 3 dataframes with Pandas将 3 个数据框与 Pandas 合并
【发布时间】:2021-10-08 16:18:56
【问题描述】:

我有 3 个具有相同 ID 列的数据框。我想将它们组合成一个数据框。我想结合 SQL 中的内部连接逻辑。当我尝试下面的代码时,它会给出以下结果。即使 ID 列匹配,它也会正确连接两个数据框,但会使最后一个错误。我怎样才能解决这个问题?提前感谢您的帮助。

dfs = [DF1, DF2, DF3]

df_final = reduce(lambda left, right: pd.merge(left, right, on=["ID"], how="outer"), dfs)

output

已解决:DF1中ID列的数据类型是int,其他都是str。在问这个问题之前,我在 DF1 中找到了 ID 列并得到了以下结果。然后,当我将它们全部转换为 int 数据类型时,我得到了我想要的结果。

【问题讨论】:

  • 能否提供 3 个数据帧的样本?
  • 你说你想内部加入他们,但你正在做一个外部加入。只需要换成how='inner'吗?
  • 查看您的输出,我的第一个猜测是您的一个数据框的 ID 列是不同的 dtype。也许两个有 int 列,而第三个是字符串?
  • 尝试创建MCVE
  • 是的,我想要内部连接,我尝试了 how=inner 但它返回了空 df。

标签: python pandas dataframe join merge


【解决方案1】:

使用join:

# use set index to add 'join' key into the index and 
# create a list of dataframes using list comprehension
l = [df.set_index('ID') for df in [df1,df2,df3])

# pd.DataFrame.join accepts a list of dataframes as 'other'
l[0].join(l[1:])

【讨论】:

    【解决方案2】:

    您的 ID 不是相同的 dtype:

    >>> DF1
       ID  A
    0  10  1
    1  20  2
    2  30  3
    
    >>> DF2
       ID  K
    0  30  3
    1  10  1
    2  20  2
    
    >>> DF3
       ID  P
    0  20  2
    1  30  3
    2  10  1
    

    您的代码:

    dfs = [DF1, DF2, DF3]
    
    df_final = reduce(lambda left, right: pd.merge(left, right, on=["ID"], how="outer"), dfs)
    

    输出:

    >>> df_final
       ID  A  K  P
    0  10  1  1  1
    1  20  2  2  2
    2  30  3  3  3
    

    【讨论】:

    • DF1中ID列的数据类型为int,其他为str。首先我将 DF1 转换为 str 并在问题中得到结果。在随后的 cmets 之后,我把它全部 int 并得到了我想要的结果。非常感谢您的帮助:)
    猜你喜欢
    • 2021-12-14
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 2018-01-31
    • 2017-06-27
    • 2017-01-21
    相关资源
    最近更新 更多