使用输入中的多个文件识别多个列表的交集



我正在尝试编写一个代码,它将Metadata.txt作为输入,然后识别不同输入文件中的常见基因,这些文件的名称是从Metadata.txt文件中提取的。

Metadata.txt 示例

SIG1 SIG2文件1文件3文件2文件4文件3文件5文件4

我目录中的文件是File1.xls、File2.xls、文件3.xls…文件6.xls。为了简单起见,我对文件1和文件3以及文件2和文件4都有相同的输入。

File1.xls或File3.xls

TargetID FoldChange p值Adjusted-pA 0.543528215 0.000518847 0.000518847B 0.638469898 0.00204759 0.002204759C 1.936595724 0.00250229 0.00250229D 0.65732154 0.012840013 0.012840013E 1.728842021 0.00251105 0.00251105F 2.024842641 0.000719261 0.000719261G 4.049059413 2.25E-05 2.25E-5H 0.478660942 0.000352179 0.000352179I 0.449304016 0.000489521 0.000489521

File2.xls或File4.xls

TargetID FoldChange p值Adjusted-pJJ 0.453537892 4.22E-06 4.22E-6A 0.558325503 0.001697851 0.0011697851B 0.637336564 7.64E-05 7.64E-5D 1.8084553034 0.000492439 0.000492439E 0.378445825 1.72E-05 1.72E-5jjj 1.601997491 0.019618883 0.019618883

File5.xls

TargetID FoldChange p值Adjusted-pA 3.140223972 0.013347275 0.01334727B 1.5205222 0.032318774 0.03 2318774C 1.532760451 0.043763101 0.04 3763101D 1.522865896 0.001791471 0.001917471

目标是输出两个文件"SIG1.txt"one_answers"SIG2.txt",这两个文件分别具有File1/File2和File3/File4/File5之间的共同基因。因此,元数据提供了一个对事物进行迭代的平台。以下是我目前所拥有的:

md_input = pd.read_table("Metadata.txt", sep="t")  #opens the metadata file
for c in range(0, len(md_input.columns)):
        first_file=md_input.ix[0,c]+".xls"
        print first_file #this will print "File1.xls" for column1 and File3.xls for column#2
        first_sig=pd.read_table(first_file, sep="t", usecols=["TargetID", 'FoldChange']) #opens the first file
        list1=list(first_file.iloc[:,0]) #takes column of first file and converts to list
        #Then, I aim to iterate over the remaining files in each column of the metadata and find the intersection/common with each other. I tried the following:
        for i in range(1, md_input.count()[c]):
            list2=[]
            df=pd.read_table("{}.xls".format(md_input.ix[i,c]), sep="t", usecols=["TargetID", 'FoldChange'])
            list2=list(df.iloc[:,0]) #assign the LIST
            common=list(set(list_up_0).intersection(set(list2))) #find intersection
print common

当我打印"common"时,我只得到带有LAST文件的common。考虑到我是如何编写循环/代码的,这是意料之中的。我找不到一种方法来迭代列中的所有文件,保持其打开状态,然后识别交叉点。

如果我需要进一步澄清以上内容,请告知。我知道这听起来很复杂,但不应该。t试图简化它,我希望它能起到

的作用

我终于能够让它工作了。我不确定这是否是最简单的方法,但它有效。我认为下面脚本中令人困惑的部分是使用globals键来允许打开多个文件,并根据for循环中的#指定文件名。不管怎样,剧本是有效的,它也考虑到了折叠的变化。我希望这对其他人有用。

md_input = pd.read_table('Metadata.txt', sep="t")
list_cols=list(md_input.columns)
df=pd.DataFrame(columns=list_cols)
for c in range(0, len(md_input.columns)):
    sets_up=[]
    sets_down=[]
    for i in range(0, md_input.count()[c]):
        globals()["file_"+str(i)]=md_input.ix[i,c]+".xls"
        globals()["sig_"+str(i)]=pd.read_table(globals()["file_"+str(i)], sep="t", usecols=["TargetID", 'FoldChange'])
        globals()["List_up"+str(i)]=[]
        globals()["List_down"+str(i)]=[]
        for z in range(0, len(globals()["sig_"+str(i)].index)):
            if globals()["sig_"+str(i)].ix[z,'FoldChange']>=1.5:
                globals()["List_up"+str(i)].append(globals()["sig_"+str(i)].iloc[z,0])
            elif globals()["sig_"+str(i)].ix[z,'FoldChange']<=1.5:
                globals()["List_down"+str(i)].append(globals()["sig_"+str(i)].iloc[z,0])
        sets_up.append(set(globals()["List_up"+str(i)]))
        sets_down.append(set(globals()["List_down"+str(i)]))
    common_up=list(set.intersection(*sets_up))
    common_down=list(set.intersection(*sets_down))
    common=common_up + common_down
    for x in range(0, len(common)):
        df.loc[x,md_input.columns[c]]=common[x]
df.to_csv("Output.xls",sep="t", index=False)

相关内容

  • 没有找到相关文章

最新更新