Было бы полезно, если бы вы дали конкретный пример, но я продемонстрирую с помощью списка @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')])