Skip to main content
 首页 » 编程设计

python之如何通过索引合并列重叠的值来合并多个 DataFrame

2025年05月04日13txw1958

我有很多 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 

这似乎符合您的预期输出。