手元に2つのファイルがあります。
1つは遺伝子名と疾患名の対応表です。
gene disease
A2ML1 noonan syndrome
AAR2 developmental delay, microcephaly, brain & hea...
AARS charcot-marie-tooth disease, type ii, charcot-...
...
もう一つは解析結果のファイルで、16列目がgene,17列目がgene_IDとなっています。
16列目のgeneは
gene
GSTM1
LOC101927027,PRKRA
CCZ1
CDK13,HIGD1AP7,MPLKIP,C7orf10
IGH,KIAA0125,IGHD2-8,IGHD1-7,IGHD6-6,IGHD5-5,IGHD4-4
...
のようになっていて、複数の場合はカンマで区切られています。
この2つ目のファイルのgeneが1つ目のファイルの対応表に含まれている場合、2つ目のファイルの18列目と19列目(ファイルは全部で17列です)に、その遺伝子名と疾患名を加えようとしています。geneが複数ある場合は、改行して、1から17列目はgeneの数だけ同じ内容を並べたいです。
欲しいファイルの形は
a1,a2,...,a17,GSTM1,疾患名
b1,b2,...,b17,LOC101927027,疾患名
b1,b2,...,b17,PRKRA,疾患名
c1,c2,...,c17,CCZ1,疾患名
...
です。
【やったこと】
import numpy as np from pandas import Series,DataFrame import pandas as pd import re df1 = pd.read_table("遺伝子疾患対応表.txt") dic = {df1.iloc[i,0] : df1.iloc[i,1] for i in range(df1.shape[0])}
遺伝子と疾患の対応を辞書にしました。
df2 = pd.read_table("解析結果.txt")
geneが1つでカンマがない場合は、
def toOverlapGene(row): gene_name = row['gene'] if gene_name in dic: row['gene_name'] = gene_name+'\t'+dic[gene_name] return row df2 = df2.apply(toOverlapGene,axis=1) df2 = df2.dropna(how='any') print(df2) df2.to_excel('結果ファイル.xlsx')
でなんとかなったのですが、geneが複数の時の方法がよくわかりません。
for i in range(df2.shape[0]): if ',' in df2.iloc[i,15]: genes = df2.iloc[i,15].split(',') for j in range(len(genes)): gene = genes[j] if gene in dic: print(df2.iloc[i]+'\t'+gene+'\t'+dic[gene])
で1つ目のファイルに載っていたgene,疾患名を追加しようとしましたが、
TypeError: ufunc 'add' did not contain a loop with signature matching types dtype('<U32') dtype('<U32') dtype('<U32')
というエラーが出てしまいました。
何かいい方法をご存知の方は教えていただけますと助かります。
よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー