Python 使用熊猫将两个数据帧中的不同列连接起来(并附加类似列)

Python 使用熊猫将两个数据帧中的不同列连接起来(并附加类似列),python,pandas,dataframe,merge,concat,Python,Pandas,Dataframe,Merge,Concat,我的问题与密切相关,但不完全相同。 我想连接三个数据帧中不同的列。数据帧有一个列id和一些相同的列:Ex df1 df2 df3 结果: id place name qty unit A B C D 1 NY Tom 2 10 a b c d 2 TK Ron 3 15 a b c d 3 Lon Don 5 90 a b c d 4 Hk Sam 4 49 a b c d 列place、name、qty和unit将始终是三个数据帧

我的问题与密切相关,但不完全相同。

我想连接三个数据帧中不同的列。数据帧有一个列id和一些相同的列:Ex

df1

df2

df3

结果:

id place name qty unit A B C D
1 NY    Tom   2  10   a b c d
2 TK    Ron   3  15   a b c d
3 Lon   Don   5  90   a b c d
4 Hk    Sam   4  49   a b c d
列place、name、qty和unit将始终是三个数据帧的一部分,不同的列的名称可能会有所不同(在我的示例中是A、B、C、D)。这三个数据帧的行数相同

我试过:

cols_to_use = df1.columns - df2.columns
dfNew = merge(df, df2[cols_to_use], left_index=True, right_index=True, how='outer')

问题是,在结果数据帧中(使用concat时),我得到的行比预期的多,列也被重命名

您可以使用嵌套合并

merge_on = ['id','place','name','qty','unit']
df1.merge(df2, on = merge_on).merge(df3, on = merge_on)



    id  place   name    qty unit    A   B   C   D
0   1   NY      Tom     2   10      a   b   c   d
1   2   TK      Ron     3   15      a   b   c   d
2   3   Lon     Don     5   90      a   b   c   d
3   4   Hk      Sam     4   49      a   b   c   d

您只能从
df2
(和
df3
中提取
df1
中尚未存在的列。然后只需使用连接数据帧:

cols = [c for c in df2.columns if c not in df1.columns]
df = pd.concat([df1, df2[cols]], axis=1)

使用
functools

from functools import reduce
reduce(lambda left,right: pd.merge(left,right), [df1,df2,df3])
Out[725]: 
   id place name  qty  unit  A  B  C  D
0   1    NY  Tom    2    10  a  b  c  d
1   2    TK  Ron    3    15  a  b  c  d
2   3   Lon  Don    5    90  a  b  c  d
3   4    Hk  Sam    4    49  a  b  c  d

concat
groupby
first一起使用

pd.concat([df1, df2, df3], 1).groupby(level=0, axis=1).first()


可以使用
df=reduce(lambda left,right:pd.merge(left,right'),dfs)进行检查!我将尝试itExcellent,时间回到文档:)太好了!你认为这个解决方案是最有效的吗?我有一个大的数据集。@ MIG的实际大小是什么?@文中大约有20000行(流)@ MIG,所有的函数都应该工作,20000行不算大,我通常用1000万行工作,我既合并又CONTAT工作。
cols = [c for c in df2.columns if c not in df1.columns]
df = pd.concat([df1, df2[cols]], axis=1)
from functools import reduce
reduce(lambda left,right: pd.merge(left,right), [df1,df2,df3])
Out[725]: 
   id place name  qty  unit  A  B  C  D
0   1    NY  Tom    2    10  a  b  c  d
1   2    TK  Ron    3    15  a  b  c  d
2   3   Lon  Don    5    90  a  b  c  d
3   4    Hk  Sam    4    49  a  b  c  d
pd.concat([df1, df2, df3], 1).groupby(level=0, axis=1).first()
   A  B  C  D  id name place  qty  unit
0  a  b  c  d   1  Tom    NY    2    10
1  a  b  c  d   2  Ron    TK    3    15
2  a  b  c  d   3  Don   Lon    5    90
3  a  b  c  d   4  Sam    Hk    4    49