基于公共列合并多个数据框[重复]
Posted
技术标签:
【中文标题】基于公共列合并多个数据框[重复]【英文标题】: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')
【参考方案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】:
使用merge
和reduce
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 ...以上是关于基于公共列合并多个数据框[重复]的主要内容,如果未能解决你的问题,请参考以下文章
将两个数据框与一些公共列合并,其中公共的组合需要是自定义函数
基于Pandas.Dataframe中的多个列合并多个重复行