2015-04-30 2 views
0

Я следующее пространство данных, разделенных (mydata.txt):Использование для цикла для создания панды DataFrame (не-словарь, основанный)

sample1 probe1 gene1 3.23 
sample1 probe1 gene2 1.20 
sample2 probe1 gene1 2.20 
sample2 probe2 gene1 0.12 

То, что я хочу сделать, это создать кадр данных, который выглядит как это:

probe gene sample1 sample2 
probe1 gene1 3.23  2.20 
probe1 gene2 1.20  NA 
probe2 gene1 NA  0.12 

Тем не менее, вместо того, чтобы преобразовывать данные сразу после прочтения CSV (например, через pandas.DataFrame.from_csv), Я хотел бы построить этот кадр данных из для цикла. Я попытался это, но не

#!/usr/bin/env python 
import pandas as pd 
import csv 

infile = "mydata.txt" 

alltups = [] 
with open(infile, 'r') as tsvfile: 
    tabreader = csv.reader(tsvfile, delimiter=' ') 
    for row in tabreader: 
     sample, probe, gene, foldchange = row 
     tup = (sample, [probe,gene,foldchange]) 
     alltups.append(tup) 

df = pd.DataFrame.from_items(alltups) 
print df 

Который производит:

sample1 sample1 sample2 sample2 
0 probe1 probe1 probe1 probe2 
1 gene1 gene2 gene1 gene1 
2 3.23 1.20 2.20 0.12 

Что правильный способ сделать это?

ответ

1

Вы можете создать temp с циклом:

alltups = [] 
tabreader = csv.reader(open(infile, 'r'), delimiter='\t') 
for row in tabreader: 
     alltups.append(row) 
## -- End pasted text -- 

    In [1280]: pd.DataFrame(alltups).rename(columns={0:'Sample',1:'Probe',2:'Gene',3:'Value'}) 
Out[1280]: 
    Sample Probe Gene Value 
0 sample1 probe1 gene1 3.23 
1 sample1 probe1 gene2 1.20 
2 sample2 probe1 gene1 2.20 
3 sample2 probe2 gene1 0.12 

In [1287]: temp['Value'] = temp['Value'].astype(float) 

или с temp = pd.read_csv('test.txt', sep='\t'), который используется ниже: это получается из простого поворота, если вы нормально не использовать для цикла:

In [1239]: temp.pivot_table(index=['Probe','Gene'], columns='Sample',values='Value') 
Out[1239]: 
Sample  sample1 sample2 
Probe Gene     
probe1 gene1  3.23  2.20 
     gene2  1.20  NaN 
probe2 gene1  NaN  0.12 
+0

Как создать «temp» из цикла for (loopreader)? – neversaint

+0

Вы имеете в виду выход, правильно? – fixxxer

+0

Нет. Я имею в виду 'temp' в вашем коде' temp.pivot_table'. И, наконец, я хотел бы написать файл CSV, как в OP. Поэтому в колонке зонда не должно быть «отверстий». Как я могу это достичь? – neversaint

0

Я понятия не имею, почему вы хотите использовать цикл for. Разве это не намного проще?

df = pd.read_csv('mydata.txt', 
       sep=" ", 
       index_col=[1, 2, 0], 
       names=['sample', 'probe', 'gene', 'value']).unstack() 

>>> df 
       value   
sample  sample1 sample2 
probe gene     
probe1 gene1 3.23 2.20 
     gene2 1.20  NaN 
probe2 gene1  NaN 0.12 
+0

, потому что в моем фактическом случае 'mydata.txt' является структурой данных другого процесса. – neversaint

+0

Можете ли вы сначала создать DataFrame, а затем преобразовать/изменить его? Если это так, этот подход все равно будет работать (вам просто не нужно читать_csv). – Alexander

Смежные вопросы