我有 25 个数据帧,我需要合并这些数据帧并从所有 25 个数据帧中查找经常出现的行, 例如,我的数据框如下所示,
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
最后,我的目标是有一个如下所示的输出数据框,
chr start end name Sample
1 12334 12334 AAA df1
1 12334 12334 AAA df2
1 12334 12334 AAA df3
我可以通过以下解决方案到达那里, 通过字典将所有这三个数据帧添加到一个更大的数据帧 dfs
dfs = {'df1': df1,'df2': df2}
然后更进一步,
common_tups = set.intersection(*[set(df[['chr', 'start', 'end']].drop_duplicates().apply(tuple, axis=1).values) for df in dfs.values()])
pd.concat([df[df[['chr', 'start', 'end']].apply(tuple, axis=1).isin(common_tups)].assign(Sample=name) for (name, df) in dfs.items()])
这给出了结果数据帧,其中包含所有三个数据帧中的匹配行,但我有 25 个数据帧,我从目录中将其作为列表调用,如下所示,
path = 'Fltered_vcfs/'
files = os.listdir(path)
results = [os.path.join(path,i) for i in files if i.startswith('vcf_filtered')]
那么我如何在字典中显示“结果”列表并进一步获取所需的输出。非常感谢任何帮助或建议。
谢谢
最佳答案
使用glob
模块,您可以使用
import os
from glob import glob
path = 'Fltered_vcfs'
f_names = glob(os.path.join(path, 'vcf_filtered*.*'))
然后,您的字典可以用dictionary comprehension创建使用
import pandas as pd
{os.path.splitext(os.path.split(f_name)[1])[0]: pd.read_csv(f_name,sep='\t') for f_name in f_names}
关于python - 根据匹配列映射多个数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39701779/