ПРИМЕЧАНИЕ. Необходимость преобразования Pandas DataFrame в массив (или список), подобный этому, может свидетельствовать о других проблемах. Я настоятельно рекомендую убедиться, что DataFrame является подходящей структурой данных для вашего конкретного случая использования, и что Pandas не включает какой-либо способ выполнения операций, которые вас интересуют.
AMC
Ответы:
354
Чтобы получить массив NumPy, вы должны использовать valuesатрибут:
In[1]: df = pd.DataFrame({'A':[1,2,3],'B':[4,5,6]}, index=['a','b','c']); df
A B
a 14
b 25
c 36In[2]: df.index.valuesOut[2]: array(['a','b','c'], dtype=object)
Это дает доступ к тому, как данные уже сохранены, поэтому нет необходимости в преобразовании.
Примечание. Этот атрибут также доступен для объектов многих других панд.
Примечание: .valuesустарело, .to_numpy()является рекомендуемой заменой, если вы хотите массив NumPy. Можете ли вы расширить это Доступ к тому, как данные уже хранятся, поэтому нет необходимости для преобразования ?
AMC
Ответ на cs95 дает большое объяснение .values, .to_numpy()и .array.
AMC
75
Вы можете использовать df.indexдля доступа к объекту индекса, а затем получить значения в списке с помощью df.index.tolist(). Точно так же вы можете использовать df['col'].tolist()для серии.
df.index.tolist()не возвращает метод экземпляра. Возвращает список индексов. Это метод, определенный по индексу панд. В то время как первый вызов значения возможен, делегирование задания numpy - это не исправление, а альтернатива.
Айхан
51
панды> = 0,24
Устаревайте ваше использование .valuesв пользу этих методов!
С v0.24.0 года, мы будем иметь два бренда Порка новые, предпочтительные способы получения Numpy массивов из Index, Seriesи DataFrameобъекты: они to_numpy(), и .array. Что касается использования, документы упоминают:
Мы не удалили или устарели Series.valuesили
DataFrame.values, но мы настоятельно рекомендуем и использовать .arrayили
.to_numpy()вместо.
Относительно того, что возвращено, документы упоминают,
Для Seriesи Indexпри поддержке обычных массивов NumPy Series.array
вернет новый arrays.PandasArray, который является тонкой (без копирования) оболочкой вокруг numpy.ndarray. arrays.PandasArrayсам по себе не особенно полезен, но обеспечивает тот же интерфейс, что и любой массив расширений, определенный в pandas или сторонней библиотеке.
Итак, подведем итог, .arrayвернемся либо
Существующая ExtensionArrayподдержка Индекс / Серия, или
Если существует массив NumPy, поддерживающий серию, новый ExtensionArrayобъект создается в качестве тонкой оболочки над базовым массивом.
Обоснование добавления ДВУХ новых методов
Эти функции были добавлены в результате обсуждений в двух выпусках GitHub GH19954 и GH23623 .
В частности, в документах упоминается обоснование:
[...] с .valuesэтим было неясно, будет ли возвращаемое значение фактическим массивом, некоторым его преобразованием или одним из пользовательских массивов панд (например Categorical). Например, с PeriodIndex, каждый раз .values
генерирует новые ndarrayобъекты периода. [...]
Эти две функции направлены на улучшение согласованности API, что является важным шагом в правильном направлении.
Наконец, .valuesне будет устаревшим в текущей версии, но я ожидаю, что это может произойти в какой-то момент в будущем, поэтому я призываю пользователей перейти на более новый API, как только вы сможете.
Если вы имеете дело с мультииндексным фреймом данных, вас может заинтересовать извлечение только столбца с одним именем мультииндекса. Вы можете сделать это как
df.index.get_level_values('name_sub_index')
и, конечно, name_sub_indexдолжен быть элементомFrozenListdf.index.names
Есть ли разница между этим и .values? (Я обновил информацию о версии, поскольку эта функция появилась в документах 0.13.0.)
Энди Хейден,
@Andy Hayden: Разве нет одного различия в том, что .get_values является официальным способом получения только текущих значений, в то время как .values (например, для мультииндекса) может возвращать значения индекса, для которых были удалены строки или столбцы?
Иезекииль Круглик
@EzekielKruglick, так что это всегда копия? Ссылка на документацию очень легкая, я не думал, что вы получите такие дураки (даже если они в MI, они не будут в .values), было бы здорово увидеть пример, который демонстрирует это!
Энди Хейден,
@AndyHayden: я думаю, что я неправильно прочитал ваш комментарий. Вы правы, .values - это хорошо, .level - устаревший, а get_values - правильные текущие значения за исключением пропущенных строк / столбцов Оригинальная проблема github: github.com/pydata/pandas/issues/3686 Но я только что проверил, и похоже, что .values (конечно!) Дает обновленную информацию просто в другой форме, чем я думал, о которой мы говорили
Иезекииль Круглик
1
@ AndyHayden Нет, разницы нет. get_valuesпросто звонки .values. Больше символов для ввода.
cs95
0
Я преобразовал панд dataframeв listи затем использовал основные list.index(). Что-то вроде этого:
dd = list(zone[0])#Where zone[0] is some specific column of the table
idx = dd.index(filename[i])
Ниже приведен простой способ преобразования столбца данных в массив массивов.
df = pd.DataFrame(somedict)
ytrain = df['label']
ytrain_numpy = np.array([x for x in ytrain['label']])
ytrain_numpy - это пустой массив.
Я пытался с, to.numpy()но он дал мне следующую ошибку:
TypeError: не поддерживается преобразование для типов: (dtype ('O'),) при выполнении классификации Binary Relevance с использованием Linear SVC. to.numpy () преобразовывал dataFrame в массив numpy, но тип данных внутреннего элемента был list, из-за чего наблюдалась вышеуказанная ошибка.
Я попытался с to.numpy (), но он дал мне следующую ошибку: TypeError: не поддерживается преобразование для типов: (dtype ('O'),) при выполнении классификации Binary Relevance с использованием Linear SVC. to.numpy () преобразовывал dataFrame в массив numpy, но тип данных внутреннего элемента был list, из-за чего наблюдалась вышеуказанная ошибка. Это не совсем вина to_numpy, хотя.
Ответы:
Чтобы получить массив NumPy, вы должны использовать
values
атрибут:Это дает доступ к тому, как данные уже сохранены, поэтому нет необходимости в преобразовании.
Примечание. Этот атрибут также доступен для объектов многих других панд.
Чтобы получить индекс в виде списка, позвоните
tolist
:И аналогично для столбцов.
источник
.values
устарело,.to_numpy()
является рекомендуемой заменой, если вы хотите массив NumPy. Можете ли вы расширить это Доступ к тому, как данные уже хранятся, поэтому нет необходимости для преобразования ?.values
,.to_numpy()
и.array
.Вы можете использовать
df.index
для доступа к объекту индекса, а затем получить значения в списке с помощьюdf.index.tolist()
. Точно так же вы можете использоватьdf['col'].tolist()
для серии.источник
df.index.values.tolist()
df.index.tolist()
не возвращает метод экземпляра. Возвращает список индексов. Это метод, определенный по индексу панд. В то время как первый вызов значения возможен, делегирование задания numpy - это не исправление, а альтернатива.панды> = 0,24
Устаревайте ваше использование
.values
в пользу этих методов!С v0.24.0 года, мы будем иметь два бренда Порка новые, предпочтительные способы получения Numpy массивов из
Index
,Series
иDataFrame
объекты: ониto_numpy()
, и.array
. Что касается использования, документы упоминают:См. Этот раздел примечаний к выпуску v0.24.0 для получения дополнительной информации.
to_numpy()
методПо умолчанию представление возвращается. Любые сделанные изменения будут влиять на оригинал.
Если вам нужна копия, используйте
to_numpy(copy=True
);Обратите внимание, что эта функция также работает для DataFrames (пока
.array
нет).array
АтрибутЭтот атрибут возвращает
ExtensionArray
объект, который поддерживает индекс / серию.Отсюда можно получить список, используя
list
:или просто позвоните
.tolist()
:Относительно того, что возвращено, документы упоминают,
Итак, подведем итог,
.array
вернемся либоExtensionArray
поддержка Индекс / Серия, илиExtensionArray
объект создается в качестве тонкой оболочки над базовым массивом.Обоснование добавления ДВУХ новых методов
Эти функции были добавлены в результате обсуждений в двух выпусках GitHub GH19954 и GH23623 .
В частности, в документах упоминается обоснование:
Эти две функции направлены на улучшение согласованности API, что является важным шагом в правильном направлении.
Наконец,
.values
не будет устаревшим в текущей версии, но я ожидаю, что это может произойти в какой-то момент в будущем, поэтому я призываю пользователей перейти на более новый API, как только вы сможете.источник
Если вы имеете дело с мультииндексным фреймом данных, вас может заинтересовать извлечение только столбца с одним именем мультииндекса. Вы можете сделать это как
и, конечно,
name_sub_index
должен быть элементомFrozenList
df.index.names
источник
Начиная с pandas v0.13 вы также можете использовать
get_values
:источник
get_values
просто звонки.values
. Больше символов для ввода.Я преобразовал панд
dataframe
вlist
и затем использовал основныеlist.index()
. Что-то вроде этого:У вас есть значение индекса как
idx
.источник
Более свежий способ сделать это - использовать функцию .to_numpy ().
Если у меня есть фрейм данных со столбцом «цена», я могу преобразовать его следующим образом:
Вы также можете передать тип данных, такой как float или object, в качестве аргумента функции
источник
Ниже приведен простой способ преобразования столбца данных в массив массивов.
ytrain_numpy - это пустой массив.
Я пытался с,
to.numpy()
но он дал мне следующую ошибку: TypeError: не поддерживается преобразование для типов: (dtype ('O'),) при выполнении классификации Binary Relevance с использованием Linear SVC. to.numpy () преобразовывал dataFrame в массив numpy, но тип данных внутреннего элемента был list, из-за чего наблюдалась вышеуказанная ошибка.источник
to_numpy
, хотя.