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

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

Ответ 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 для получения дополнительной информации.


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 итог, .array вернет либо

  1. Существующий ExtensionArray поддерживающий индекс/серию, или
  2. Если существует массив 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.