【问题标题】:Mapping multiple dataframe based on the matching columns根据匹配列映射多个数据框
【发布时间】:2016-09-26 23:11:25
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: python pandas numpy dataframe


    【解决方案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}
    

    【讨论】:

    • 有一个问题,我的实际数据农场有更多列,比如每个列有 18 个。
    • @user1017373 不确定是什么问题。如果您只想加载特定的列子集,可以使用usecols=['start', 'end', 'name']。这是你的问题吗?
    • 不,加载整列,然后根据这三列中的匹配行进行合并:[['chr', 'start', 'end'].,问题是一样的,但输入稍微不同,并且使用上述解决方案,即使在去除所有数据帧的空白之后,它也会抛出索引错误消息,KeyError: "['chr' 'start' 'end'] not in index"
    • @user1017373 但是看起来他们只是不在索引中,不是吗?因此,您的输入看起来与您的算法规范不匹配。
    • 实际上列的名称与我在演示算法中指定的不同,并且当我对真实数据帧使用相同的名称时,我已经更改了。就像真正的 dfs 有我需要的列是 as 、 chrom 、 start 和 end
    猜你喜欢
    • 1970-01-01
    • 2017-01-16
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    • 2020-04-11
    • 2021-10-04
    相关资源
    最近更新 更多