Python 基于三列匹配值将多个数据帧合并为单个数据帧

Python 基于三列匹配值将多个数据帧合并为单个数据帧,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,我有多个数据帧(25个数据帧),我在寻找所有数据帧的三列中重复出现的行值。下面是我的daframes示例 df1 chr start end name 1 12334 12334 AAA 1 2342 2342 SAP 2 3456 3456 SOS 3 4537 4537 ABR df2 chr start end name 1 12334 12334 DSF 1 3421 3421

我有多个数据帧(25个数据帧),我在寻找所有数据帧的三列中重复出现的行值。下面是我的daframes示例

df1
chr start   end     name
1   12334   12334   AAA
1   2342    2342    SAP
2   3456    3456    SOS
3   4537    4537    ABR
df2
chr start   end     name
1   12334   12334   DSF
1   3421    3421    KSF
2   7689    7689    LUF
df3 
chr start   end     name
1   12334   12334   DSF
1   3421    3421    KSF
2   4537    4537    LUF
3   8976    8976    BAR
4   6789    6789    AIN
最后,我的目标是查看这些daframe的前三列,并根据这三列值中的匹配行以及作为最后一列的datafrme的名称,提取一个新的dataframe。最后的数据框应该是这样的

chr start   end     name    Sample
1   12334   12334   AAA df1
1   12334   12334   AAA df2
1   12334   12334   AAA df3
我知道下面一行python脚本将创建上面的输出,而不将示例作为列

s1 = pd.merge(df1, df2, how='left', on=['chr', 'start', 'end'])
df_final = pd.merge(s1, df3[['chr', 'start', 'end']], how='left', on=['chr', 'start','end'])

但我有超过25个数据帧,我需要根据匹配值查找合并。如果您有一个将示例名称映射到数据帧的字典,我们将非常感谢任何健壮且更好的解决方案

dfs = {'df1': df1, 'df2': df2}
(等等)

常见的相关键(以哈希形式)为

现在,您只需要为每个DataFrame查找相关行,添加DataFrame的名称作为示例,并连接结果:

pd.concat([df[df[['chr', 'start', 'end']].apply(tuple, axis=1).isin(common_tups)].assign(Sample=name) for (name, df) in dfs.items()])

感谢您提供的解决方案,但我有以下错误,KeyError:“['end']不在索引中”,end列不在索引中index@user1017373哪一行导致了它?设置交集,common\u tups=set.intersection(*[set(df[[['chr','start','end']])。删除重复项()。在dfs.values()]中为df应用(tuple,axis=1)。值)@user1017373确定。请检查每个数据帧是否有一个
end
列?我强烈怀疑至少有一个没有。@user1017373特别是,如果“end”不在df.columns中,您能否在dfs.items()中打印出
[名称(名称,df)]
pd.concat([df[df[['chr', 'start', 'end']].apply(tuple, axis=1).isin(common_tups)].assign(Sample=name) for (name, df) in dfs.items()])