Чи знаєте ви, як отримати індекс чи стовпець 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.