合并多个文件并通过附加文件名来保存它们

时间:2017-05-09 09:36:08

标签: python pandas merge

我有以下数据框,

 Subtpe_sam_ID
 Subtype_sam_REL
 Subytpe_sam_ph
 Tab_sam_ID
 Tab_sam_REL
 Tab_sam_ph

Subtype.sam_ID.head()
chr start end ratio name 
ch1 334   456  0.1  SAP
chr2 789  788  0.6  SOP

`Tab_sam_ID.head()`
  chr start end cgid
  chr1 334  456 cgt780
  chr4 789  0.7 cg899
  chr2 789  788 cg899
对于上面的示例,

和我想要的输出必须是与Tab_subtype_sam_ID_merge

相同的文件

它看起来应该是,

Tab_subtype_sam_ID_merge.head() #as the name of the saved file

chr start end ratio name cgid
chr1 334  456 0.1 SAP  cgt780

所以我为此编写了以下代码,

path         = './Analysis/' 
files        = os.listdir(path)
Tab          = [os.path.join(path,i) for i in files if i.startswith('Tab')]  
path           = '/' 
files          = os.listdir(path)
Sub          = [os.path.join(path,i) for i in files if i.startswith('Subtype')]

for tab,homer in zip(Tab,Sub):
   df1=pd.read_csv(homer,sep='\t')
   df2=pd.read_csv(tab,sep='\t')
   name1 = os.path.basename(os.path.normpath(homer))
   name2 = os.path.basename(os.path.normpath(tab))

如果列startchr匹配Tab和子类型数据框,则合并文件的逻辑。

但是从这里我无法弄清楚我怎么能根据他们的名字合并两个文件,所以我会有3个结果数据帧。例如,如果数据帧Subtpe_sam_ID等于Tab_sam_ID(这里我的意思是字符串的最后部分等于这些数据帧中的每一个,即ID和ID),则在列chr和Start上合并。然后用一个通用名称保存。

以子类型开头的所有数据框都以相同的顺序具有相同的列,因此对于Tab _ *。

> if basename(name1)==basename(name2)
>           merge=pd.merge(df1,df2,on=['chr','Start'])
>           dirname=os.path.dirname(os.path.normpath(filename))
>           merge.to_csv(dirname +merge+ name, sep='\t',index=False)

任何建议或帮助都会很棒.. !!!!

1 个答案:

答案 0 :(得分:1)

您可以尝试这种方式:

import os
import pandas as pd

path = 'E:/mypc/tab_data/'
files = os.listdir(path)
Tab = [os.path.join(path,i) for i in files if i.startswith('Tab')]  

path = 'E:/mypc/subtype_data/' 
files = os.listdir(path)
Sub = [os.path.join(path,i) for i in files if i.startswith('Subtype')]

dirname = "E:/mypc/output/"

for i in Tab:
    for j in Sub:
        if "_".join(j.split("/")[-1].split("_")[1:]) == "_".join(i.split("/")[-1].split("_")[1:]):
        name = i.split("/")[-1].split("_")[0] + "_" + j.split("/")[-1]
        f = [j,i]
        df1=pd.read_csv(f[0])
        df2=pd.read_csv(f[1])
        merged_df = pd.merge(df1,df2,on=['chr','start'], suffixes=('','_')).T.drop_duplicates().T
        merged_df.to_csv(dirname + name , index=False)