2015-09-25 124 views
0

我要添加使大熊貓據幀有兩列:READ_ID和得分追加到大熊貓數據幀

我使用下面的代碼:

reads_array = [] 
    for x in Bio.SeqIO.parse("inp.fasta","fasta"): 
      reads_array.append(x) 

    columns = ["read_id","score"] 
    df = pd.DataFrame(columns = columns) 
    df = df.fillna(0) 

    for x in reads_array: 
       alignments=pairwise2.align.globalms("ACTTGAT",str(x.seq),2,-1,-.5,-.1) 
       sorted_alignments = sorted(alignments, key=operator.itemgetter(2),reverse = True) 
       read_id = x.name 
       score = sorted_alignments[0][2] 
       df['read_id'] = read_id 
       df['score'] = score 

但是,這是行不通的。你能提出一種生成數據幀的方法嗎?df

+0

那麼你所做的就是用你的循環中正在發生的任何事情覆蓋該列,你想在一個前面分配每列的全部內容,所以試着構建每一列然後在末尾分配 – EdChum

+0

看起來'reads_array'是一個填充了元組對的列表。當你運行你的第二個循環時,我不明白'x.seq'和'x.name'。這不應該引起錯誤嗎?另外,請提供一些示例數據(例如5行)。 – Alexander

+0

> read_id_1 ATTTTGG> read_id_2 TTGGATT等以fasta格式。 x.name是read_id_1,read_id_2等,x.seq是後綴 – Ssank

回答

0

在頂部,請確保您有

import numpy as np 

然後代替你共享代碼

reads_array = [] 
for x in Bio.SeqIO.parse("inp.fastq", "fastq"): 
    reads_array.append(x) 

df = pd.DataFrame(np.zeros((len(reads_array), 2)), columns=["read_id", "score"]) 

for index, x in enumerate(reads_array): 
    alignments = pairwise2.align.globalms("ACTTGAT", str(x.seq), 2, -1, -.5, -.1) 
    sorted_alignments = sorted(alignments, key=operator.itemgetter(2), reverse=True) 
    read_id = x.name 
    score = sorted_alignments[0][2] 
    df.loc[index, 'read_id'] = read_id 
    df.loc[index, 'score'] = score 

的主要問題與你的原碼是兩件事情:

1)您的數據幀有0行

2)df ['column_name']引用整列而不是單個單元格,因此當您執行df ['column_name'] = value時,該列中的所有單元格都會獲得設置爲該值

0

df['read_id']df['score']是系列。所以,如果你想要遍歷reads_array和計算一些數值,然後將其分配到DF中的列,請嘗試以下操作:

for i, x in enumerate(reads_array): 
    ... 
    df.ix[i]['read_id'] = read_id 
    df.ix[i]['score'] = score