Конвертировать pandas DataFrame в массив записей без дополнительного столбца - PullRequest
4 голосов
/ 23 мая 2019

У меня есть следующий код

import numpy as np
import pandas as pd

test_array = np.array([(1, 2, 3), (4, 5, 6)], 
                      dtype={'names': ('a', 'b', 'c'), 'formats': ('f8', 'f8', 'f8')})
test_df = pd.DataFrame.from_records(test_array)
test_df.to_records().view(np.float64).reshape(test_array.shape + (-1, ))

Я ожидаю, что будет возвращено представление оригинала test_array с формой (2, 3), однако я получаю этот массив (2, 4).

rec.array([[0.e+000, 1.e+000, 2.e+000, 3.e+000],
           [5.e-324, 4.e+000, 5.e+000, 6.e+000]],
          dtype=float64)

Откуда взялся дополнительный столбец, столбец 0?

Редактировать: Я только что узнал, что могу использовать DataFrame.values(), чтобы сделать то же самое, но мне по-прежнему любопытно, почему это поведениесуществует.

Ответы [ 3 ]

3 голосов
/ 23 мая 2019

Если вам нужен массив записей, используйте np.rec.fromrecords:

np.rec.fromrecords(test_df, names=[*test_df])
# rec.array([(1., 2., 3.), (4., 5., 6.)],
#          dtype=[('a', '<f8'), ('b', '<f8'), ('c', '<f8')])

Мои тесты показывают, что это быстрее некоторых df.to_records.

2 голосов
/ 23 мая 2019

Установите index=False в to_records:

test_df.to_records(index=False).view(np.float64).reshape(test_array.shape + (-1, ))

2 голосов
/ 23 мая 2019

to_records также захватывает индекс.Обратите внимание, что это указано в документах :

Индекс будет включен в качестве первого поля массива записей, если требуется

Если вы хотитечтобы исключить его, просто установите index=False.


Хотя в вашем случае вы можете просто использовать to_numpy (или values):

test_df.to_numpy().view(np.float64).reshape(test_array.shape + (-1, ))

array([[1., 2., 3.],
       [4., 5., 6.]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...