我有很多 DataFrame 需要合并。
假设:
base: id constraint
1 'a'
2 'b'
3 'c'
df_1: id value constraint
1 1 'a'
2 2 'a'
3 3 'a'
df_2: id value constraint
1 1 'b'
2 2 'b'
3 3 'b'
df_3: id value constraint
1 1 'c'
2 2 'c'
3 3 'c'
If I try and merge all of them (it'll be in a loop), I get:
a = pd.merge(base, df_1, on=['id', 'constraint'], how='left')
b = pd.merge(a, df_2, on=['id', 'constraint'], how='left')
c = pd.merge(b, df_3, on=['id', 'constraint'], how='left')
id constraint value value_x value_y 1 'a' 1 NaN NaN 2 'b' NaN 2 NaN 3 'c' NaN NaN 3
期望的输出是:
id constraint value 1 'a' 1 2 'b' 2 3 'c' 3
我知道 combine_first 并且它有效,但我不能采用这种方法,因为它慢了数千倍。
是否有合并可以在列重叠的情况下替换值?
有点类似于this question , 没有答案。
请您参考如下方法:
鉴于您的 MCVE:
import pandas as pd
base = pd.DataFrame([1,2,3], columns=['id'])
df1 = pd.DataFrame([[1,1]], columns=['id', 'value'])
df2 = pd.DataFrame([[2,2]], columns=['id', 'value'])
df3 = pd.DataFrame([[3,3]], columns=['id', 'value'])
我建议先连接你的数据框(如果需要使用循环):
df = pd.concat([df1, df2, df3])
然后合并:
pd.merge(base, df, on='id')
它产生:
id value
0 1 1
1 2 2
2 3 3
更新
使用新版本的问题和 @Celius Stingher 提供的输入运行代码:
a = {'id':[1,2,3],'constrains':['a','b','c']}
b = {'id':[1,2,3],'value':[1,2,3],'constrains':['a','a','a']}
c = {'id':[1,2,3],'value':[1,2,3],'constrains':['b','b','b']}
d = {'id':[1,2,3],'value':[1,2,3],'constrains':['c','c','c']}
base = pd.DataFrame(a)
df1 = pd.DataFrame(b)
df2 = pd.DataFrame(c)
df3 = pd.DataFrame(d)
我们得到:
id constrains value
0 1 a 1
1 2 b 2
2 3 c 3
这似乎符合您的预期输出。
