python - 根据匹配列映射多个数据帧

标签 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')]

那么我如何在字典中显示“结果”列表并进一步获取所需的输出。非常感谢任何帮助或建议。

谢谢

最佳答案

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

相关文章:

python - 如何将 2 个 Pandas Dataframes(已旋转)与列上的层次索引合并

python - reshape DataFrame 并根据其他 24 列修改一列

python - Cython 偏导数

python - 如何使用 python 确定音乐文件中存在的频率

python - 字符串到 Python 中的 OrderedDict 转换

python - 如何循环遍历 pandas 数据框以对每个变量运行独立的 t 检验?

python - 如何在 numba 中使用 numpy 函数

python - 生成线条的热图图像

python - 在 Django 中编辑配置文件

python - 操纵神经网络的输出