Как преобразовать серию панд или индекс в массив Numpy?

264

Знаете ли вы, как получить индекс или столбец DataFrame в виде массива NumPy или списка Python?

ericmjl
источник
Также связано: Преобразование
кадра данных
Отвечает ли это на ваш вопрос? Конвертируйте pandas dataframe в массив NumPy
AMC
1
ПРИМЕЧАНИЕ. Необходимость преобразования 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  1  4
b  2  5
c  3  6

In [2]: df.index.values
Out[2]: array(['a', 'b', 'c'], dtype=object)

Это дает доступ к тому, как данные уже сохранены, поэтому нет необходимости в преобразовании.
Примечание. Этот атрибут также доступен для объектов многих других панд.

In [3]: df['A'].values
Out[3]: Out[16]: array([1, 2, 3])

Чтобы получить индекс в виде списка, позвоните tolist:

In [4]: df.index.tolist()
Out[4]: ['a', 'b', 'c']

И аналогично для столбцов.

Энди Хейден
источник
Примечание: .valuesустарело, .to_numpy()является рекомендуемой заменой, если вы хотите массив NumPy. Можете ли вы расширить это Доступ к тому, как данные уже хранятся, поэтому нет необходимости для преобразования ?
AMC
Ответ на cs95 дает большое объяснение .values, .to_numpy()и .array.
AMC
75

Вы можете использовать df.indexдля доступа к объекту индекса, а затем получить значения в списке с помощью df.index.tolist(). Точно так же вы можете использовать df['col'].tolist()для серии.

bdiamante
источник
Он возвращает instanceMethod, а не массив списков
V Shreyas
12
@VShreyas, как насчетdf.index.values.tolist()
LancelotHolmes
3
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()вместо.

См. Этот раздел примечаний к выпуску v0.24.0 для получения дополнительной информации.


to_numpy() метод

df.index.to_numpy()
# array(['a', 'b'], dtype=object)

df['A'].to_numpy()
#  array([1, 4])

По умолчанию представление возвращается. Любые сделанные изменения будут влиять на оригинал.

v = df.index.to_numpy()
v[0] = -1

df
    A  B
-1  1  2
b   4  5

Если вам нужна копия, используйте to_numpy(copy=True);

v = df.index.to_numpy(copy=True)
v[-1] = -123

df
   A  B
a  1  2
b  4  5

Обратите внимание, что эта функция также работает для DataFrames (пока .arrayнет).


arrayАтрибут
Этот атрибут возвращаетExtensionArrayобъект, который поддерживает индекс / серию.

pd.__version__
# '0.24.0rc1'

# Setup.
df = pd.DataFrame([[1, 2], [4, 5]], columns=['A', 'B'], index=['a', 'b'])
df

   A  B
a  1  2
b  4  5

df.index.array    
# <PandasArray>
# ['a', 'b']
# Length: 2, dtype: object

df['A'].array
# <PandasArray>
# [1, 4]
# Length: 2, dtype: int64

Отсюда можно получить список, используя list:

list(df.index.array)
# ['a', 'b']

list(df['A'].array)
# [1, 4]

или просто позвоните .tolist():

df.index.tolist()
# ['a', 'b']

df['A'].tolist()
# [1, 4]

Относительно того, что возвращено, документы упоминают,

Для Seriesи Indexпри поддержке обычных массивов NumPy Series.array вернет новый arrays.PandasArray, который является тонкой (без копирования) оболочкой вокруг numpy.ndarray. arrays.PandasArrayсам по себе не особенно полезен, но обеспечивает тот же интерфейс, что и любой массив расширений, определенный в pandas или сторонней библиотеке.

Итак, подведем итог, .arrayвернемся либо

  1. Существующая ExtensionArrayподдержка Индекс / Серия, или
  2. Если существует массив NumPy, поддерживающий серию, новый ExtensionArrayобъект создается в качестве тонкой оболочки над базовым массивом.

Обоснование добавления ДВУХ новых методов
Эти функции были добавлены в результате обсуждений в двух выпусках GitHub GH19954 и GH23623 .

В частности, в документах упоминается обоснование:

[...] с .valuesэтим было неясно, будет ли возвращаемое значение фактическим массивом, некоторым его преобразованием или одним из пользовательских массивов панд (например Categorical). Например, с PeriodIndex, каждый раз .values генерирует новые ndarrayобъекты периода. [...]

Эти две функции направлены на улучшение согласованности API, что является важным шагом в правильном направлении.

Наконец, .valuesне будет устаревшим в текущей версии, но я ожидаю, что это может произойти в какой-то момент в будущем, поэтому я призываю пользователей перейти на более новый API, как только вы сможете.

cs95
источник
48

Если вы имеете дело с мультииндексным фреймом данных, вас может заинтересовать извлечение только столбца с одним именем мультииндекса. Вы можете сделать это как

df.index.get_level_values('name_sub_index')

и, конечно, name_sub_indexдолжен быть элементомFrozenList df.index.names

gg349
источник
16

Начиная с pandas v0.13 вы также можете использовать get_values:

df.index.get_values()
yemu
источник
5
Есть ли разница между этим и .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])

У вас есть значение индекса как idx.

Сарвагья Гупта
источник
а затем использовал базовый list.index () Как это связано с вопросом преобразования серии в список?
AMC
0

Более свежий способ сделать это - использовать функцию .to_numpy ().

Если у меня есть фрейм данных со столбцом «цена», я могу преобразовать его следующим образом:

priceArray = df['price'].to_numpy()

Вы также можете передать тип данных, такой как float или object, в качестве аргумента функции

Джон Р
источник
-1

Ниже приведен простой способ преобразования столбца данных в массив массивов.

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, хотя.
AMC