Преобразовать текстовый файл из трех столбцов в матрицу - PullRequest
1 голос
/ 17 июля 2010

Здравствуйте, я хотел бы преобразовать файл с разделителями табуляции и выглядеть следующим образом:

Species Date Data
1       Dec   3 
2       Jan   4
2       Dec   6
2       Dec   3

в такую ​​матрицу (разновидность - заголовок строки):

    1  2
Dec 3  9
Jan    4

Я предполагаю, что часть решения заключается в создании словаря с двумя ключами и использовании defaultdict для добавления новых значений в пару ключей.Я хотел бы выложить это в форму с разделителями табуляции, но также перейти в формат, чтобы я мог использовать кластерную часть scipy.

Ответы [ 3 ]

2 голосов
/ 06 декабря 2012

С пандами это просто. Вы можете прочитать ваш текстовый файл с помощью read_table (), но я вручную создал фрейм данных ниже.

from pandas import DataFrame    
#create the data frame
df = DataFrame({'Species' : [1,2,2,2],
     'Date' : ['Dec','Jan', 'Dec', 'Dec'],
     'Data' : [3,4,6,3]} )

#group by the Date and Species columns, and take the sume of the Data column
df2 = df.groupby(['Date','Species'])['Data'].sum()

# unstack the Species Column to reshape your data
df2.unstack('Species')
2 голосов
/ 17 июля 2010

Объект DataFrame в библиотеке pandas делает это довольно простым.

import csv
from collections import defaultdict
from pandas import DataFrame

rdr = csv.reader(open('mat.txt'), delimiter=' ', skipinitialspace=True)
datacols = defaultdict(list)

# skip header
rdr.next()
for spec, dat, num in rdr:
    datacols['species'].append(int(spec))
    datacols['dates'].append(dat)
    datacols['data'].append(int(num))

df = DataFrame(datacols)
df2 = df.pivot(index='dates', columns='species', values='data')

Сначала мы читаем данные из файла в указанном вами формате. Затем создайте словарь столбцов (datacol), так как это то, чего хочет панда DataFrame. После того, как DataFrame создан (df), затем вызовите его метод сводки, чтобы получить его в нужном формате. Вот как df и df2 выглядят в консоли:

In [205]: df
Out[205]:
     data           dates          species
0    3              Dec            1
1    4              Jan            2
2    6              Dec            2
3    3              Dec            2


In [206]: df2
Out[206]:
       1              2
Dec    3              3
Jan    NaN            4

Затем вы можете использовать метод toCSV, чтобы сохранить его в файл (см. Ранее ссылки на документы DataFrame).

1 голос
/ 17 июля 2010

Я не знаю numpy, поэтому я могу только частично помочь, но я нашел, что написание этого небольшого фрагмента занимательно, так что вот с defaultdict:

# we'll pretend *f* is a file below
f = '''Species Date Data
1       Dec   3 
2       Jan   4
2       Dec   6
2       Dec   3'''.split('\n')[1:]

from collections import defaultdict

d = defaultdict(int)
for ln in f:
    x,y,n = ln.split()
    d[x,y] += int(n)

# transpose the list of tuples (keys) to get the two dimensions, remove the duplicates
x,y = map(set, zip(*d))

print list(x)
for yy in y:
    print yy, [d[xx,yy] for xx in x]

и результат выполнения этого будет

['1', '2']
Jan [0, 4]
Dec [3, 9]

Милый, не правда ли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...