根据匹配列

时间:2016-09-26 11:35:39

标签: python pandas numpy dataframe

我有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')]

因此,如何在字典中显示列表“结果”并继续进行以获得所需的输出。非常感谢任何帮助或建议。

谢谢

1 个答案:

答案 0 :(得分:1)

使用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}