Чи знаєте ви, як отримати індекс чи стовпець DataFrame як масив NumPy або список python?
Чи знаєте ви, як отримати індекс чи стовпець DataFrame як масив NumPy або список python?
Відповіді:
Щоб отримати масив 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. Чи можете ви розширити цей параметр? Це доступ до того, як дані вже зберігаються, тому немає необхідності в конверсії ?
Ви можете використовувати df.index
для доступу до об'єкта індексу, а потім отримувати значення у списку, використовуючи df.index.tolist()
. Так само ви можете використовувати df['col'].tolist()
для Series.
df.index.values.tolist()
df.index.tolist()
не повертає метод примірника. Він повертає список індексів. Це метод, визначений на індексі панд. Хоча виклик значень спочатку - це можливість, делегування завдання до нумерування - це не виправлення - лише альтернатива.
.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
не є особливо корисним самостійно, але він забезпечує той же інтерфейс, що і будь-який масив розширень, визначений в пандах або сторонніми бібліотеками.
Отже, підсумовуючи, .array
повернемося будь-яке
ExtensionArray
резервна копія індексу / серії, абоExtensionArray
об’єкт створюється у вигляді тонкої обгортки над базовим масивом.Обґрунтування додавання ДВА нових методів
Ці функції були додані в результаті обговорень під двома проблемами GitHub GH19954 та GH23623 .
Конкретно в документах згадується обгрунтування:
[...] з
.values
ним було незрозуміло, чи буде повернене значення фактичним масивом, деяким перетворенням його чи одним із користувацьких масивів панди (якCategorical
). Наприклад, зPeriodIndex
, кожного разу.values
створює новіndarray
об'єкти періоду. [...]
Ці дві функції спрямовані на поліпшення узгодженості API, що є головним кроком у правильному напрямку.
Нарешті, .values
не буде застарілим у поточній версії, але я думаю, що це може статися в якийсь момент у майбутньому, тому я б закликав користувачів перейти до новішого API, як тільки можна.
Оскільки панди v0.13 ви також можете використовувати get_values
:
df.index.get_values()
get_values
просто дзвінки .values
. Набирає більше символів.
Я перетворив панд dataframe
в list
і потім використовувати основний list.index()
. Щось на зразок цього:
dd = list(zone[0]) #Where zone[0] is some specific column of the table
idx = dd.index(filename[i])
Ви маєте значення індексу як idx
.
Нижче наводиться простий спосіб перетворення стовпця фрейму даних в масивний масив.
df = pd.DataFrame(somedict)
ytrain = df['label']
ytrain_numpy = np.array([x for x in ytrain['label']])
ytrain_numpy - це масивний ряд.
Я спробував, to.numpy()
але це дало мені помилку нижче:
TypeError: немає підтримуваної конверсії для типів: (dtype ('O'),) під час класифікації бінарної релевантності за допомогою лінійного SVC. to.numpy () перетворював dataFrame в numpy масив, але тип даних внутрішнього елемента був списком, через який спостерігалася вищевказана помилка.
to_numpy
.