2013-10-27 4 views
1

Я хотел бы прочитать в csv-файле, используя genfromtxt. У меня есть шесть столбцов, которые являются float, и один столбец, который является строкой.Python genfromtext несколько типов данных

Как установить тип данных, чтобы столбцы с плавающей точкой были считаны как поплавки, а колонка строки будет считана в виде строк? Я попробовал dtype = 'void', но это не работает.

Предложения?

Благодаря

.csv файл

999.9, abc, 34, 78, 12.3 
1.3, ghf, 12, 8.4, 23.7 
101.7, evf, 89, 2.4, 11.3 



x = sys.argv[1] 
f = open(x, 'r') 
y = np.genfromtxt(f, delimiter = ',', dtype=[('f0', '<f8'), ('f1', 'S4'), (\ 
'f2', '<f8'), ('f3', '<f8'), ('f4', '<f8'), ('f5', '<f8'), ('f6', '<f8')]) 

ionenergy = y[:,0] 
units = y[:,1] 

Ошибка:

ionenergy = y[:,0] 
IndexError: invalid index 

я не получаю эту ошибку, когда я задать один тип данных ..

ответ

4

dtype=None рассказывает genfromtxt, чтобы угадать соответствующий тип.

От the docs:

dtype: dtype, optional

Data type of the resulting array. If None, the dtypes will be determined by the contents of each column, individually.

(. Курсив мой)


Поскольку ваши данные разделенных запятыми, не забудьте включить delimiter=',' или иначе np.genfromtxt будет интерпретировать каждый столбец (execpt последний), в том числе строковый символ (запятая) и, следовательно, ошибочно назначать строковый dtype для каждого из этих столбцов.

Например:

import numpy as np 

arr = np.genfromtxt('data', dtype=None, delimiter=',') 

print(arr.dtype) 
# [('f0', '<f8'), ('f1', 'S4'), ('f2', '<i4'), ('f3', '<f8'), ('f4', '<f8')] 

Это показывает имена и dtypes каждого столбца. Например, ('f3', <f8) означает, что четвертая колонка имеет имя 'f3' и имеет dtype '< i4. Значение i означает, что это целочисленный тип dtype. Если вам нужен третий столбец для float dtype, тогда есть несколько вариантов.

  1. Вы можете вручную редактировать данные, добавляя десятичную точку в третьей колонке, чтобы заставить genfromtxt интерпретировать значения в этом столбце , чтобы быть флоат DTYPE.
  2. Вы можете поставить DTYPE явно в вызове genfromtxt

    arr = np.genfromtxt(
        'data', delimiter=',', 
        dtype=[('f0', '<f8'), ('f1', 'S4'), ('f2', '<f4'), ('f3', '<f8'), ('f4', '<f8')]) 
    

print(arr) 
# [(999.9, ' abc', 34, 78.0, 12.3) (1.3, ' ghf', 12, 8.4, 23.7) 
# (101.7, ' evf', 89, 2.4, 11.3)] 

print(arr['f2']) 
# [34 12 89] 

Сообщение об ошибке IndexError: invalid index генерируется линией

ionenergy = y[:,0] 

Когда у вас есть смешанные типы, np.genfromtxt возвращает structured array. Вам нужно прочитать структурированные массивы, потому что синтаксис для доступа к столбцам отличается от синтаксиса, используемого для простых массивов однородного типа.

Вместо y[:, 0], чтобы получить доступ к первому колонку структурированного массива y, используйте

y['f0'] 

Или, еще лучше, поставить параметр names в np.genfromtxt, так что вы можете использовать более соответствующее имя столбца, как y['ionenergy']:

import numpy as np 
arr = np.genfromtxt(
    'data', delimiter=',', dtype=None, 
    names=['ionenergy', 'foo', 'bar', 'baz', 'quux', 'corge']) 

print(arr['ionenergy']) 
# [ 999.9 1.3 101.7] 
+0

Спасибо, но я тоже попробовал, и он не работал. – user2483176

+0

Каков был результат dtype? Был ли какой-либо текст в столбцах, которые должны быть 'float'? Вы использовали 'names' или' skip_header' для обработки заголовка (если таковой был)? – unutbu

+0

У меня нет заголовка. Использование dtype = None, я получаю ошибку недопустимого диапазона индексов, когда пытаюсь назначить каждый столбец. Кроме того, в столбце нет текста, который должен быть просто плавающим. – user2483176

0

Пожалуйста, попробуйте следующее:

import numpy 

ionenergy = y.iloc[:,0] 
units = y.iloc[:,1] 
+1

Привет @Joye, можете ли вы объяснить, что здесь делает конструкция .iloc, и что это связано с типами данных? –

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