Знаете ли вы, как получить индекс или столбец 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
.