2017-02-05 6 views
0

Я импортирую матрицу данных csv 153,673*25 с целыми числами, поплавками и строками с помощью pandas через консоль IPython в Spyder Anaconda (Python 2). Затем я хочу преобразовать эти данные в структурированный массив, указав имена столбцов через имена столбцов pandaframe и типы вручную. Вот код - функции importing_data.run() и attributes_names.run() соответственно импортировать данные CSV в формате pandaframe и извлекать имена столбцов в pandaframe в виде списка:Структурированный массив Python не работает

import pandas 
import numpy 
import importing_data 
import attributes_names 

csv_data = importing_data.run() 
names  = attributes_names.run(csv_data) 

type_list = ['int', 
       'str', 
       'str', 
       ... 
       'float', 
       'int', 
       'int', 
       ] 

data_type = zip(names,type_list) 

n_rows  = len(csv_data.ix[:,0]) 
n_columns = len(csv_data.ix[0,:]) 
data_sample = numpy.zeros((n_rows,n_columns),dtype=data_type) 

for i in range(0,n_columns): 
    column    = csv_data.ix[:,i].values 
    data_sample[:,i] = column 

Однако окончательный цикл, кажется, терпит неудачу: она иногда толкает ядро для перезапуска, а когда нет, массив data_sample имеет неожиданную структуру; Я не могу точно описать это, поскольку в последнее время у меня только перезагрузка ядра, но я считаю, что это был размерный массив 153,673*25, составленный из 153,673 мерных списков.

Что я здесь делаю неправильно?


Редактировать

Первая ошибка, которую я делал это следующим образом: вместо

data_sample = numpy.zeros((n_rows,n_columns),dtype=data_type) 

я должен поставить:

data_sample = numpy.zeros((n_rows,1),dtype=data_type) 

Я пересмотрел петля следующим образом:

for i in range(0,n_rows): 
    data_sample[i,0] = csv_data.values[i,:] 

Но теперь я получаю следующее сообщение об ошибке: TypeError: expected a single-segment buffer object

+0

Непонятно, что вы пытаетесь достичь ... Можете ли вы предоставить небольшой набор данных образцов (3-5 строк) и нужный набор данных? Пожалуйста, прочитайте [как сделать хорошие воспроизводимые примеры pandas] (http://stackoverflow.com/questions/20109391/how-to-make-good-reproducible-pandas-examples) – MaxU

+0

Попробуйте инициировать 'data_sample' to' (nrows,) '; и выполните 'data_sample [row] = tuple (csvdata ...)'. – hpaulj

ответ

0

восстанавливающего вашу проблему без всех панд осложнений:

In [695]: names=['a','b','c'] 
In [696]: type_list=['int','float','int'] 
In [697]: datatype=list(zip(names,type_list)) 
In [698]: dt = np.dtype(datatype) 
In [699]: dt 
Out[699]: dtype([('a', '<i4'), ('b', '<f8'), ('c', '<i4')]) 

Сделайте data массив lilke csv_data.values. Так как вы ожидаете строки и числа, я подозреваю, что это массив объектов DTYPE (панд курортов на этот DTYPE довольно часто)

In [712]: data = np.arange(12).reshape(4,3).astype(object) 
In [713]: data 
Out[713]: 
array([[0, 1, 2], 
     [3, 4, 5], 
     [6, 7, 8], 
     [9, 10, 11]], dtype=object) 

Создание целевого структурированы массива. Обратите внимание, что это 1d, 4 элемента (строки/записи), с 3-х полей (от DTYPE)

In [714]: A = np.zeros((4,), dtype=dt) 
In [715]: A 
Out[715]: 
array([(0, 0., 0), (0, 0., 0), (0, 0., 0), (0, 0., 0)], 
     dtype=[('a', '<i4'), ('b', '<f8'), ('c', '<i4')]) 

На вход структурированного массива должен быть кортеж или список кортежей

In [716]: for i in range(4): 
    ...:  A[i] = tuple(data[i,:]) 

In [717]: A 
Out[717]: 
array([(0, 1., 2), (3, 4., 5), (6, 7., 8), (9, 10., 11)], 
     dtype=[('a', '<i4'), ('b', '<f8'), ('c', '<i4')]) 

Присвоение список работает, но сохраняет неожиданные значения. Я подозреваю, что он делает копии байт, не обращая внимания на dtype.

In [718]: for i in range(4): 
    ...:  A[i] = data[i,:] 

In [719]: A 
Out[719]: 
array([(139402288, 1.17777468e-268, 0), 
     (139402336, 1.17780241e-268, 0), 
     (139402384, 1.17783014e-268, 0), (139402432, 1.17785787e-268, 0)], 
     dtype=[('a', '<i4'), ('b', '<f8'), ('c', '<i4')]) 

Я мог бы также создать A напрямую, данные список кортежей

In [720]: d = [tuple(r) for r in data] 
In [721]: d 
Out[721]: [(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11)] 
In [722]: A=np.array(d, dtype=dt) 
In [723]: A 
Out[723]: 
array([(0, 1., 2), (3, 4., 5), (6, 7., 8), (9, 10., 11)], 
     dtype=[('a', '<i4'), ('b', '<f8'), ('c', '<i4')]) 

Вы также можете назначить значения по имени поля.Часто это происходит быстрее, поскольку обычно имеется больше строк, чем поля.

In [725]: for i,n in enumerate(dt.names): 
    ...:  print(i,n) 
    ...:  A[n] = data[:,i] 
    ...:  
0 a 
1 b 
2 c 
In [726]: A 
Out[726]: 
array([(0, 1., 2), (3, 4., 5), (6, 7., 8), (9, 10., 11)], 
     dtype=[('a', '<i4'), ('b', '<f8'), ('c', '<i4')]) 

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

  • Нет связанных вопросов^_^