Python 如何通过索引合并列重叠的值来合并多个数据帧?

Python 如何通过索引合并列重叠的值来合并多个数据帧?,python,pandas,dataframe,Python,Pandas,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'

我有许多需要合并的数据帧

比如说:

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' id约束值x值y 1'a'1楠楠楠 2'b'南2南 3'c'楠楠3 所需的输出将是:

id constraint value 1 'a' 1 2 'b' 2 3 'c' 3 id约束值 1'a'1 2'b'2 3'c'3 我知道先使用
combine\u
,它可以工作,但我不能使用这种方法,因为它要慢上千次

是否有一个
合并
,可以在列重叠的情况下替换值

这有点类似于,没有答案。

考虑到您的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'])
我建议首先连接数据帧(如果需要,使用循环):

然后合并:

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
这似乎符合您的预期输出。

您可以使用
ffill()
用于以下目的:

df_1 = pd.DataFrame({'val':[1]}, index=[1])
df_2 = pd.DataFrame({'val':[2]}, index=[2])
df_3 = pd.DataFrame({'val':[3]}, index=[3])

(pd.concat((df_1,df_2,df_3), axis=1)
   .ffill(1)
   .iloc[:,-1]
)
输出:

1    1.0
2    2.0
3    3.0
Name: val, dtype: float64
   id constrains  value
0   1          a    1.0
1   2          b    2.0
2   3          c    3.0
对于您的新数据:

base.merge(pd.concat((df1,df2,df3)),
           on=['id','constraint'],
           how='left')
输出:

   id constraint  value
0   1        'a'      1
1   2        'b'      2
2   3        'c'      3

结论:您实际上是在
merge
中寻找选项
how='left'
,如果您必须仅将所有数据帧与基本帧合并:

基于编辑 输出:

1    1.0
2    2.0
3    3.0
Name: val, dtype: float64
   id constrains  value
0   1          a    1.0
1   2          b    2.0
2   3          c    3.0

对于那些只想进行
合并
,重写值(这是我的情况)的人,可以使用这种方法实现,这与

文件化版本已打开

将熊猫作为pa导入
def rmerge(左、右,**kwargs):
#用于从中展平列表的函数http://rosettacode.org/wiki/Flatten_a_list#Python
def展平(lst):
返回和(([x]如果不存在(x,列表),则为lst中的x展平(x),[])
#将“left”中删除重叠列的默认值设置为true
myargs={'replace':'left'}
myargs.update(kwargs)
#从要发送到的参数dict中删除replace键
#熊猫合并命令
kwargs={k:v代表k,如果k不是'replace',则在myargs.items()中为v
如果myargs['replace']不是无:
#生成与联接不关联的重叠列名列表
skipcols=set(展平([v代表k,v在myargs.items()中,如果k在['on','left\u on','right\u on']]))
leftcols=set(left.columns)
rightcols=set(right.columns)
dropcols=list((leftcols和rightcols).difference(skipcols))
#从相应的数据框中删除重叠的列名
如果myargs['replace'].lower()=='left':
left=left.copy().drop(dropcols,轴=1)
elif myargs['replace'].lower()=='right':
right=right.copy().drop(dropcols,axis=1)
df=pa.merge(左、右,**kwargs)
返回df
import pandas as pd
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)
df_1 = pd.DataFrame(b)
df_2 = pd.DataFrame(c)
df_3 = pd.DataFrame(d)

dataframes = [df_1,df_2,df_3]
for i in dataframes:
    base = base.merge(i,how='left',on=['id','constrains'])
summation = [col for col in base if col.startswith('value')]
base['value'] = base[summation].sum(axis=1)
base = base.dropna(how='any',axis=1)
print(base)
   id constrains  value
0   1          a    1.0
1   2          b    2.0
2   3          c    3.0