我正在尝试编写一个代码,它将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)