Python 使用熊猫将两个数据帧中的不同列连接起来(并附加类似列)
我的问题与密切相关,但不完全相同。 我想连接三个数据帧中不同的列。数据帧有一个列id和一些相同的列:Ex df1 df2 df3 结果: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 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