【问题标题】:Merging multiple dataframe bassed on matching values from three column into single dataframe将基于匹配值的多个数据帧从三列合并到单个数据帧中
【发布时间】:2016-09-23 13:16:05
【问题描述】:

我有多个数据帧(25 个数据帧),我正在从所有数据帧的三列中寻找反复出现的行值。以下是我的 daframe 示例

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 的前三列,并根据这 3 列值中的匹配行以及作为最后一列的 datafrme 名称提取新的数据框。所以最终的数据框应该是这样的,

chr start   end     name    Sample
1   12334   12334   AAA df1
1   12334   12334   AAA df2
1   12334   12334   AAA df3

我知道下面的 python 脚本行将创建上面的输出,而不用 Sample 作为列。

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 个数据框,我需要根据匹配值来寻找合并。任何强大且更好的解决方案将不胜感激

【问题讨论】:

    标签: python pandas numpy dataframe


    【解决方案1】:

    假设您有一个将样本名称映射到 DataFrames 的字典:

    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()])
    

    现在您只需要为每个 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'] not in index", end column is not index
    • @user1017373 是哪一行导致的?
    • 设置交集,common_tups = set.intersection(*[set(df[['chr', 'start', 'end']].drop_duplicates().apply(tuple, axis=1 ).values) 中的 dfs.values()])
    • @user1017373 好的。您能否检查每个 DataFrame 是否实际上有一个 end 列?我强烈怀疑至少有一个没有。
    • @user1017373 具体可以打印出[name for (name, df) in dfs.items() if 'end' not in df.columns]吗?
    猜你喜欢
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 2020-10-15
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    相关资源
    最近更新 更多