Знаете ли вы, как получить индекс или столбец DataFrame в виде массива NumPy или списка Python?
Как преобразовать серию панд или индекс в массив Numpy?
Ответ 1
Чтобы получить массив 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']
И аналогично для столбцов.
Ответ 2
Вы можете использовать df.index для доступа к объекту индекса, а затем получить значения в списке, используя df.index.tolist(). Точно так же вы можете использовать df['col'].tolist() для Series.
Ответ 3
Если вы имеете дело с мультииндексным фреймворком данных, вам может быть интересно извлечь только столбец одного имени мультииндекса. Вы можете сделать это как
df.index.get_level_values('name_sub_index')
и, конечно, name_sub_index должен быть элементом FrozenList df.index.names
Ответ 4
По состоянию на v0.24. 0+, 2019.
Устаревайте ваше использование .values в пользу этих методов!
Начиная с v0.24.0, у нас будут два совершенно новых, предпочтительных метода получения массивов NumPy из объектов Index, Series и DataFrame: это to_numpy() и .array. Что касается использования, документы упоминают:
Мы не удалили и не
Series.valuesилиDataFrame.values, но мы настоятельно рекомендуем использовать.arrayили.to_numpy().
См. Этот раздел примечаний к выпуску v0.24.0 для получения дополнительной информации.
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 итог, .array вернет либо
- Существующий
ExtensionArrayподдерживающий индекс/серию, или - Если существует массив NumPy, поддерживающий серию, новый объект
ExtensionArrayсоздается в виде тонкой оболочки над базовым массивом.
Обоснование добавления ДВУХ новых методов
Эти функции были добавлены в результате обсуждений в двух выпусках GitHub GH19954 и GH23623.
В частности, в документах упоминается обоснование:
[...] с
.valuesбыло неясно, будет ли возвращаемое значение фактическим массивом, некоторым его преобразованием или одним из пользовательских массивов панд (например,Categorical). Например, сPeriodIndex,.valuesкаждый раз генерирует новыйndarrayобъектов периода. [...]
Эти две функции направлены на улучшение согласованности API, что является важным шагом в правильном направлении.
Наконец, .values не будет устаревшей в текущей версии, но я ожидаю, что это может произойти в какой-то момент в будущем, поэтому я призываю пользователей перейти на более новый API, как только вы сможете.
Ответ 5
Начиная с pandas v0.13 вы также можете использовать get_values:
df.index.get_values()
Ответ 6
Ниже приведен простой способ преобразования столбца данных в массив массивов.
df = pd.DataFrame(somedict)
ytrain = df['label']
ytrain_numpy = np.array([x for x in ytrain['label']])
ytrain_numpy - это массив numpy.
Я попытался с to.numpy() но он дал мне to.numpy() ошибку: TypeError: не поддерживается преобразование для типов: (dtype ('O'),) при выполнении классификации Binary Relevance с использованием Linear SVC. to.numpy() конвертировал dataFrame в массив numpy, но тип данных внутреннего элемента был list, из-за чего наблюдалась вышеуказанная ошибка.
Ответ 7
Я преобразовал pandas dataframe в list а затем использовал базовый list.index(). Что-то вроде этого:
dd = list(zone[0]) #Where zone[0] is some specific column of the table
idx = dd.index(filename[i])
У вас есть значение индекса как idx.