【问题标题】:Merge multiple dataframes based on a common column [duplicate]基于公共列合并多个数据框[重复]
【发布时间】:2019-02-12 20:05:37
【问题描述】:

我有三个数据框。它们都有一个公共列,我需要根据公共列合并它们,而不会丢失任何数据

输入

>>>df1 0 列 1 列 2 列 3 1 个数据 1 3 4 2 数据2 4 3 3 数据 3 2 3 4 数据4 2 4 5 个数据 5 1 4 >>>df2 0 列 1 列 4 列 5 1 个数据 1 7 4 2 数据 2 6 9 3 数据 3 1 4 >>>df3 0 列 1 列 6 列 7 1 个数据 2 5 8 2 数据 3 2 7 3 数据 5 5 3

预期输出

>>>df 0 列 1 列 2 列 3 列 4 列 5 列 6 列 7 1 个数据 1 3 4 7 4 2 个数据 2 4 3 6 9 5 8 3 数据 3 2 3 1 4 2 7 4 数据4 2 4 5 个数据 5 1 4 5 3

【问题讨论】:

  • 请根据您在研究中的发现展示您的尝试,我们可以解释为什么它没有按预期工作。
  • 我已经这样做了,但是有些行丢失了dfs = [df3,df1,df2] df_final = reduce(lambda left,right: pd.merge(left,right,on='Col1'), dfs)
  • df = pd.concat([df1,df2,df3],axis=1,sort=False).reset_index() df.rename(columns = {'index':'Col1'})

标签: python pandas dataframe merge concat


【解决方案1】:

你可以的

df1.merge(df2, how='left', left_on='Col1', right_on='Col1').merge(df3, how='left', left_on='Col1', right_on='Col1')

【讨论】:

  • 如果我的列超过 3 列,是否需要扩展该链?
  • 查看@Zero 的解决方案,了解一种无需显式链接合并的方法
  • 是的,我知道了,即使@Sandeep 的回答也很好
【解决方案2】:

在这里试试这行代码:

 df.set_index('key').join(df2.set_index('key'))

您可以查看“密钥”上的文档以正确引用您的代码。 https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.join.html

将“键”设置为您希望与其余列合并的列!

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    使用pd.concat

    df1.set_index('Col1',inplace=True)
    df2.set_index('Col1',inplace=True)
    df3.set_index('Col1',inplace=True)
    df = pd.concat([df1,df2,df3],axis=1,sort=False).reset_index()
    df.rename(columns = {'index':'Col1'})
    
        Col1    Col2    Col3    Col4    Col5    Col6    Col7
    0   data1   3       4       7.0     4.0     NaN     NaN
    1   data2   4       3       6.0     9.0     5.0     8.0
    2   data3   2       3       1.0     4.0     2.0     7.0
    3   data4   2       4       NaN     NaN     NaN     NaN
    4   data5   1       4       NaN     NaN     5.0     3.0
    

    【讨论】:

    • Traceback (most recent call last): File "extraction.py", line 291, in <module> df_final = pd.concat([df0,df1,df2,df3,df4,df5,df6,df7],axis=1,sort=False).reset_index(drop=True) TypeError: concat() got an unexpected keyword argument 'sort'
    • @FunnyCoder 该错误可能是由于pandas 我的版本是'0.23.4'。如果您的年龄较大,请删除 sort=False 并尝试。 pandas=0.23.0中增加了sort参数。
    • 我的版本是0.18.1. 删除了排序参数并且工作正常。
    【解决方案4】:

    使用mergereduce

    In [86]: from functools import reduce
    
    In [87]: reduce(lambda x,y: pd.merge(x,y, on='Col1', how='outer'), [df1, df2, df3])
    Out[87]:
        Col1  Col2  Col3  Col4  Col5  Col6  Col7
    0  data1     3     4   7.0   4.0   NaN   NaN
    1  data2     4     3   6.0   9.0   5.0   8.0
    2  data3     2     3   1.0   4.0   2.0   7.0
    3  data4     2     4   NaN   NaN   NaN   NaN
    4  data5     1     4   NaN   NaN   5.0   3.0
    

    详情

    In [88]: df1
    Out[88]:
        Col1  Col2  Col3
    0  data1     3     4
    1  data2     4     3
    2  data3     2     3
    3  data4     2     4
    4  data5     1     4
    
    In [89]: df2
    Out[89]:
        Col1  Col4  Col5
    0  data1     7     4
    1  data2     6     9
    2  data3     1     4
    
    In [90]: df3
    Out[90]:
        Col1  Col6  Col7
    0  data2     5     8
    1  data3     2     7
    2  data5     5     3
    

    【讨论】:

    • 我得到了新的列名;公共列的名称正确,但其余列的名称更改为 value_x、value_y、value_x ...
    猜你喜欢
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 2011-05-11
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    相关资源
    最近更新 更多