Python 基于三列匹配值将多个数据帧合并为单个数据帧
我有多个数据帧(25个数据帧),我在寻找所有数据帧的三列中重复出现的行值。下面是我的daframes示例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
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()])