Python 合并多个文件并通过追加文件名保存它们

Python 合并多个文件并通过追加文件名保存它们,python,pandas,merge,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\u subtype\u sam\u ID\u 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\u subtype\u sam\u ID\u 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))
如果列
start
chr
与选项卡和子类型数据框匹配,则合并文件的逻辑

但从这里开始,我不知道如何根据两个文件的名称合并它们,所以我将得到3个结果数据帧。例如,如果数据帧子类型的samu ID等于Tab samu 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)
任何建议或帮助都会很好

您可以这样尝试:

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)

为什么不对两个列表进行排序?那么它们不是元素有序匹配吗?您好,谢谢您的回答,但是在if循环之后,似乎什么都不起作用。我的意思是df1和df2是空的,因此合并的_df变量是空的。我想知道你为什么要转置合并的df?很抱歉,现在它可以工作了,使用了一个小的chnag ein if循环,因为实名与我的主要问题有点不同,if j.split(“/”)[-1]。split(“”)[-1]==I.split(“/”)[-1]。split(“”):pd.merge为end column(即end\u x和end\u y)创建重复的列,因此为了摆脱它,我使用了T.drop\u重复项()T。
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)