次のようなタブ区切りのデータセットがあります。
PITG_00022 start_codon 262407 262409 -
PITG_00022 stop_codon 260777 260779 -
PITG_00022 exon 260867 262409 -
PITG_00022 CDS 260867 262409 -
PITG_00022 exon 260777 260826 -
PITG_00022 CDS 260780 260826 -
PITG_00023 start_codon 273160 273162 +
PITG_00023 stop_codon 274778 274780 +
PITG_00023 exon 272998 273288 +
PITG_00023 CDS 273160 273288 +
PITG_00023 exon 273368 273652 +
PITG_00023 CDS 273368 273652 +
PITG_00023 exon 273729 273788 +
PITG_00023 CDS 273729 273788 +
PITG_00023 exon 273885 273958 +
PITG_00023 CDS 273885 273958 +
PITG_00023 exon 274022 274127 +
PITG_00023 CDS 274022 274127 +
PITG_00023 exon 274194 274346 +
ここに非常に丁寧に投稿された私のコードは次のとおりです3番目の列の内容に関連して2列のタブ区切りデータを再番号付けする いくつかの変更を加えましたが、それらの変更が行われる前にエラー(以下を参照)が存在していました:
import numpy
import pandas
import pandas as pd
import sys
sys.stdout = open("outtry2.txt", "w")
data = pd.read_csv('pinfestans-edited2.csv', sep='\t')#,
#converters={'STRAND': lambda s: s[0]})
groups = data.groupby(['STRAND', 'GENE_ID'])
corrected = []
for (direction, gene_name), group in groups:
print direction,gene_name
if group.index[group.TYPE=='start_codon']:
start_exon = group.index[group.TYPE=='exon'][0]
if direction == '+':
group['POSA'] = 1 + abs(group.POS1 - group.POS1[start_exon])
group['POSB'] = 1 + abs(group.POS2 - group.POS1[start_exon])
else:
group['POSA'] = 1 - abs(group.POS2 - group.POS2[start_exon])
group['POSB'] = 1 - abs(group.POS1 - group.POS2[start_exon])
print group
corrected.append(group)
出力のサンプルを次に示します。
GENE_ID TYPE POS1 POS2 STRAND POSA POSB
104 PITG_00021 start_codon 258927 258929 + 1 3
105 PITG_00021 stop_codon 260547 260549 + 1621 1623
106 PITG_00021 exon 258927 260549 + 1 1623
107 PITG_00021 CDS 258927 260546 + 1 1620
+ PITG_00023
GENE_ID TYPE POS1 POS2 STRAND POSA POSB
114 PITG_00023 start_codon 273160 273162 + 163 165
115 PITG_00023 stop_codon 274778 274780 + 1781 1783
116 PITG_00023 exon 272998 273288 + 1 291
117 PITG_00023 CDS 273160 273288 + 163 291
118 PITG_00023 exon 273368 273652 + 371 655
119 PITG_00023 CDS 273368 273652 + 371 655
120 PITG_00023 exon 273729 273788 + 732 791
121 PITG_00023 CDS 273729 273788 + 732 791
122 PITG_00023 exon 273885 273958 + 888 961
123 PITG_00023 CDS 273885 273958 + 888 961
124 PITG_00023 exon 274022 274127 + 1025 1130
125 PITG_00023 CDS 274022 274127 + 1025 1130
126 PITG_00023 exon 274194 274346 + 1197 1349
そして、しばらく実行した後に表示されるエラーは次のとおりです。
>>>>Traceback (most recent call last):
File "C:\Users\Chris\Documents\I.S\Part-2\Convert_to_exonfile.py", line 51, in <module>
if group.index[group.TYPE=='start_codon']:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
>>>>
ここで、いくつかの計算を手動でテストしましたが、STRAND が + としてリストされている遺伝子のみを除いて、私が望んでいることを正確に実行しているように見えます (サンプル入力の PITG_00022 遺伝子が出力)。最初に + STRAND グループの計算を行っていると考えていますが、- STRAND グループに到達すると、そのエラーが発生します。今、私はany()
との使用について読んだだけでなく、同様の配列 valueError スレッドでのall()
使用についての投稿を読みましたが、それがここで私の問題をどのように解決するのか、またはそれをどのように実装するのかわかりません。set()
事前に助けていただきありがとうございます。