2015-09-25 169 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