Numpy получить dtype на столбец - PullRequest
0 голосов
/ 30 ноября 2018

Мне нужно получить тип для каждого столбца, чтобы правильно обработать его.

В настоящее время я делаю это с помощью следующего метода:

import pandas as pd

# input is of type List[List[any]]
# but has one type (int, float, str, bool) per column

df = pd.DataFrame(input, columns=key_labels)
column_types = dict(df.dtypes)
matrix = df.values

Так как я использую панд только для получения dtypes (для столбца) и использую numpy для всего остального, я хочу вырезать панд из своегопроект.

В итоге: есть ли способ получить (конкретные) dtypes для столбца из numpy

! Или: есть ли быстрый способ пересчитать dtype для ndarray (после объединения матрицы)

Ответы [ 3 ]

0 голосов
/ 30 ноября 2018

Есть ли способ получить (конкретные) dtypes для столбца от numpy

Нет, нет.Поскольку ваш фрейм данных имеет смешанные типы, ваш тип данных NumPy будет object.Такой массив не сохраняется в непрерывном блоке памяти, где каждый столбец имеет фиксированный тип d.Вместо этого каждое значение в массиве 2d состоит из указателя.

Ваш вопрос не отличается от вопроса, можете ли вы получить тип каждого «столбца» в этом списке списков:

L = [[0.5, True, 'hello'], [1.25, False, 'test']]

Поскольку данные в наборе указателей не имеют столбчатой ​​структуры, отсутствует понятие «столбец dtype».Вы можете проверить тип каждого значения для конкретных индексов в каждом подсписке.Но это побеждает точку панд / NumPy.

0 голосов
/ 30 ноября 2018

Было бы полезно, если бы вы дали конкретный пример, но я продемонстрирую с помощью списка @jpp's:

In [509]: L = [[0.5, True, 'hello'], [1.25, False, 'test']]
In [510]: df = pd.DataFrame(L)
In [511]: df
Out[511]: 
      0      1      2
0  0.50   True  hello
1  1.25  False   test
In [512]: df.dtypes
Out[512]: 
0    float64
1       bool
2     object
dtype: object

pandas не любит использовать строковые dtypes, поэтому последний столбецobject.

In [513]: arr = df.values
In [514]: arr
Out[514]: 
array([[0.5, True, 'hello'],
       [1.25, False, 'test']], dtype=object)

Так что из-за смешения в столбцах dtypes, pandas делает все это object.Я не знаю панд достаточно хорошо, чтобы понять, можете ли вы лучше контролировать dtype.

Чтобы создать структурированный массив numpy из L, очевидная вещь, которую нужно сделать:

In [515]: np.array([tuple(row) for row in L], dtype='f,bool,U10')
Out[515]: 
array([(0.5 ,  True, 'hello'), (1.25, False, 'test')],
      dtype=[('f0', '<f4'), ('f1', '?'), ('f2', '<U10')])

Это отвечает на вопрос о том, как указать другой тип d для столбца.Но имейте в виду, что этот массив является 1d и имеет fields, а не columns.

Но возможно ли автоматически определить или установить dtype, это сложнее.Может быть возможно построить recarray из столбцов или использовать одну из функций в np.lib.recfunctions.

Если я использую список 'transpose', я могу отформатировать каждый столбец как отдельный массив numpy.

In [537]: [np.array(col) for col in zip(*L)]
Out[537]: 
[array([0.5 , 1.25]),
 array([ True, False]),
 array(['hello', 'test'], dtype='<U5')]

Затем объедините их в один массив с помощью rec.fromarrays:

In [538]: np.rec.fromarrays([np.array(col) for col in zip(*L)])
Out[538]: 
rec.array([(0.5 ,  True, 'hello'), (1.25, False, 'test')],
          dtype=[('f0', '<f8'), ('f1', '?'), ('f2', '<U5')])

Или я мог бы использовать genfromtxt для вывода полей из формата csv.

In [526]: np.savetxt('test.txt', np.array(L,object),delimiter=',',fmt='%s')
In [527]: cat test.txt
0.5,True,hello
1.25,False,test

In [529]: data = np.genfromtxt('test.txt',dtype=None,delimiter=',',encoding=None)
In [530]: data
Out[530]: 
array([(0.5 ,  True, 'hello'), (1.25, False, 'test')],
      dtype=[('f0', '<f8'), ('f1', '?'), ('f2', '<U5')])
0 голосов
/ 30 ноября 2018

В numpy массив имеет одинаковые dtypes для всех своих записей.Так что нет, невозможно иметь выделенное / быстрое плавание в одном столбце, а другое - в другом столбце.

Это точка панд, позволяющая вам переходить из одного столбца одного типа в другой.

...