Я заинтересован в том, чтобы узнать, как преобразовать пандасный массив данных в массив NumPy.
dataframe:
import numpy as np
import pandas as pd
index = [1, 2, 3, 4, 5, 6, 7]
a = [np.nan, np.nan, np.nan, 0.1, 0.1, 0.1, 0.1]
b = [0.2, np.nan, 0.2, 0.2, 0.2, np.nan, np.nan]
c = [np.nan, 0.5, 0.5, np.nan, 0.5, 0.5, np.nan]
df = pd.DataFrame({'A': a, 'B': b, 'C': c}, index=index)
df = df.rename_axis('ID')
дает
label A B C
ID
1 NaN 0.2 NaN
2 NaN NaN 0.5
3 NaN 0.2 0.5
4 0.1 0.2 NaN
5 0.1 0.2 0.5
6 0.1 NaN 0.5
7 0.1 NaN NaN
Я хотел бы преобразовать это в массив NumPy следующим образом:
array([[ nan, 0.2, nan],
[ nan, nan, 0.5],
[ nan, 0.2, 0.5],
[ 0.1, 0.2, nan],
[ 0.1, 0.2, 0.5],
[ 0.1, nan, 0.5],
[ 0.1, nan, nan]])
Как я могу это сделать?
В качестве бонуса, возможно ли сохранить dtypes, как это?
array([[ 1, nan, 0.2, nan],
[ 2, nan, nan, 0.5],
[ 3, nan, 0.2, 0.5],
[ 4, 0.1, 0.2, nan],
[ 5, 0.1, 0.2, 0.5],
[ 6, 0.1, nan, 0.5],
[ 7, 0.1, nan, nan]],
dtype=[('ID', '<i4'), ('A', '<f8'), ('B', '<f8'), ('B', '<f8')])
или похожие?
Ответы:
Чтобы преобразовать pandas dataframe (df) в пустой массив ndarray, используйте этот код:
источник
Устаревайте ваше использование
values
иas_matrix()
!В pandas v0.24.0 появились два новых метода получения массивов NumPy из объектов pandas:
to_numpy()
, который определенIndex
,Series,
иDataFrame
объекты, иarray
, Который определяется наIndex
иSeries
только объекты.Если вы посетите документацию v0.24 для
.values
, вы увидите большое красное предупреждение, которое гласит:См. Этот раздел примечаний к выпуску v0.24.0 и этот ответ для получения дополнительной информации.
На пути к лучшей согласованности:
to_numpy()
В духе лучшей согласованности по всему API
to_numpy
был введен новый метод для извлечения базового массива NumPy из DataFrames.Как упоминалось выше, этот метод также определен для объектов
Index
иSeries
объектов (см. Здесь ).По умолчанию возвращается представление, поэтому любые сделанные изменения будут влиять на оригинал.
Если вам нужна копия, используйте
to_numpy(copy=True
).pandas> = 1.0 обновление для ExtensionTypes
Если вы используете pandas 1.x, скорее всего, вы будете иметь дело с типами расширений гораздо больше. Вы должны быть немного осторожнее, чтобы эти типы расширений были правильно преобразованы.
Это называется в документах .
Если вам нужно
dtypes
...Как показано в другом ответе,
DataFrame.to_records
это хороший способ сделать это.Это не может быть сделано
to_numpy
, к сожалению. Однако в качестве альтернативы вы можете использоватьnp.rec.fromrecords
:С точки зрения производительности, это почти то же самое (на самом деле, использование
rec.fromrecords
немного быстрее).Обоснование добавления нового метода
to_numpy()
(в дополнение кarray
) был добавлен в результате обсуждений в рамках двух выпусков GitHub GH19954 и GH23623 .В частности, в документах упоминается обоснование:
to_numpy
стремиться улучшить согласованность API, что является важным шагом в правильном направлении..values
не будет объявлено устаревшим в текущей версии, но я ожидаю, что это может произойти в какой-то момент в будущем, поэтому я призываю пользователей перейти на более новый API, как только вы сможете.Критика других решений
DataFrame.values
имеет противоречивое поведение, как уже отмечалось.DataFrame.get_values()
это просто обертка вокругDataFrame.values
, так что все сказанное выше применимо.DataFrame.as_matrix()
устарел сейчас, не используйте!источник
as_matrix
на другое решение, в этом случае,to_numpy
не объясняя, как восстановить функциональность выбора столбцаas_matrix
! Уверен, есть и другие способы выбора столбцов, ноas_matrix
был хотя бы один из них!df[[col1, col2']].to_numpy()
? Не уверен, почему вы думаете, что объявление об обновленной альтернативе устаревшей функции требует отрицательного ответа.Примечание .
.as_matrix()
Метод, использованный в этом ответе, устарел. Панды 0.23.4 предупреждают:У Панд есть что-то встроенное ...
дает
источник
object
.to_numpy
вместо (не.values
либо). Больше здесь .Я бы просто связал функции DataFrame.reset_index () и DataFrame.values, чтобы получить представление Numpy для dataframe, включая индекс:
Чтобы получить dtypes, нам нужно преобразовать этот ndarray в структурированный массив, используя view :
источник
Вы можете использовать
to_records
метод, но вам придется немного поиграться с dtypes, если они не те, которые вы хотите с самого начала. В моем случае, скопировав ваш DF из строки, тип индекса - это строка (представленная вobject
пандах dtype):Преобразование типа dar для recarray не работает для меня, но в Pandas это уже можно сделать:
Обратите внимание, что Pandas не устанавливает имя индекса должным образом (в
ID
) в экспортированном массиве записей (ошибка?), Поэтому мы извлекаем выгоду из преобразования типов, чтобы исправить это.В настоящий момент у Pandas есть только 8-байтовые целые числа
i8
и числа с плавающей запятойf8
(см. Эту проблему ).источник
np.array
конструктор.Похоже,
df.to_records()
будет работать для вас. Точная функция, которую вы ищете, была запрошена иto_records
указана в качестве альтернативы.Я попробовал это локально, используя ваш пример, и этот вызов дает нечто очень похожее на результат, который вы искали:
Обратите внимание, что это
recarray
скорее, чемarray
. Вы можете переместить результат в обычный массив numpy, вызвав его конструктор asnp.array(df.to_records())
.источник
to_records()
более 5 лет назад?Попробуй это:
источник
Вот мой подход к созданию массива структур из панд DataFrame.
Создать фрейм данных
Определите функцию для создания массива структур numy (не массив записей) из DataFrame pandas.
Используйте
reset_index
для создания нового фрейма данных, который включает в себя индекс как часть своих данных. Преобразуйте этот фрейм данных в структурный массив.РЕДАКТИРОВАТЬ: Обновлен df_to_sarray, чтобы избежать ошибки вызова .encode () с python 3. Спасибо Джозефу Гарвину и Halcyon за их комментарий и решение.
источник
Два способа преобразовать фрейм данных в его представление массива Numpy.
mah_np_array = df.as_matrix(columns=None)
mah_np_array = df.values
Документ: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.as_matrix.html.
источник
Более простой способ для примера DataFrame:
ОБЛАСТЬ ПРИМЕНЕНИЯ:
ПОЛУЧИТЬ:
источник
Просто была похожая проблема при экспорте из фрейма данных в таблицу arcgis и наткнулся на решение от usgs ( https://my.usgs.gov/confluence/display/cdi/pandas.DataFrame+to+ArcGIS+Table ). Короче говоря, у вашей проблемы есть похожее решение:
источник
Я прошел ответы выше. Метод as_matrix () работает, но сейчас он устарел. Для меня то, что сработало, было " .to_numpy () ".
Это возвращает многомерный массив. Я предпочитаю использовать этот метод, если вы читаете данные из таблицы Excel и вам нужен доступ к данным из любого индекса. Надеюсь это поможет :)
источник
В дополнение к ответу Метеора, я нашел код
не работает для меня Поэтому я разместил здесь свой код для удобства других, кто застрял в этой проблеме.
источник
Простой способ конвертировать dataframe в массив numpy:
Использование to_numpy рекомендуется для сохранения согласованности.
Ссылка: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_numpy.html
источник
Попробуй это:
Некоторая дополнительная информация по адресу: [ https://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html] Действительно для numpy 1.16.5 и pandas 0.25.2.
источник