基于公共列合并多个数据框

25
我有三个数据框,它们都有一个共同的列,我需要根据共同列合并它们,而不会丢失任何数据。 输入
>>>df1
0 Col1  Col2  Col3
1 data1  3      4
2 data2  4      3
3 data3  2      3
4 data4  2      4
5 data5  1      4

>>>df2
0 Col1  Col4  Col5
1 data1  7      4
2 data2  6      9
3 data3  1      4

>>>df3
0 Col1  Col6  Col7
1 data2  5      8
2 data3  2      7
3 data5  5      3

预期输出
>>>df
0 Col1  Col2  Col3  Col4 Col5  Col6  Col7
1 data1  3      4    7    4
2 data2  4      3    6    9     5     8
3 data3  2      3    1    4     2     7
4 data4  2      4
5 data5  1      4               5     3

请根据您的研究展示您的尝试,我们可以解释为什么它没有按预期工作。 - roganjosh
我已经完成了这个任务,但是有一些行数据丢失了。dfs = [df3, df1, df2] df_final = reduce(lambda left,right: pd.merge(left, right, on='Col1'), dfs) - FunnyCoder
df = pd.concat([df1,df2,df3],axis=1,sort=False).reset_index() df.rename(columns = {'index':'Col1'}) - user2110417
4个回答

53

使用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... - PM0087

20

使用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
@FunnyCoder 错误可能是由于pandas版本的问题,我的版本是'0.23.4'。如果你的版本比较旧,尝试删除sort=Falsesort参数是在pandas=0.23.0中添加的。 - Space Impact
1
我的版本是 0.18.1。移除了排序参数后,它正常工作了。 - FunnyCoder

5

您可以这样做

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

将df1、df2和df3按照'Col1'列的值进行左连接。


如果我的列数超过3列,我需要扩展那条链吗? - FunnyCoder
1
看一下@Zero的解决方案,可以在不显式链接合并的情况下完成它。 - ignoring_gravity
是的,我明白了,即使@Sandeep的答案也很好用。 - FunnyCoder

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接