Як перетворити серію або індекс панди в масив Numpy?


264

Чи знаєте ви, як отримати індекс чи стовпець DataFrame як масив NumPy або список python?



Чи відповідає це на ваше запитання? Перетворити фрейм даних панд в масив NumPy
AMC

1
ПРИМІТКА: Перетворення конвертації Pandas DataFrame в масив (або список) на зразок цього може свідчити про інші проблеми. Я настійно рекомендую переконатися, що DataFrame є відповідною структурою даних для вашого конкретного випадку використання, і що Pandas не містить жодного способу виконання операцій, які вас цікавлять.
AMC

Відповіді:


353

Щоб отримати масив 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. Чи можете ви розширити цей параметр? Це доступ до того, як дані вже зберігаються, тому немає необхідності в конверсії ?
AMC

Відповідь на cs95 дає велике пояснення .values, .to_numpy()і .array.
AMC

75

Ви можете використовувати df.indexдля доступу до об'єкта індексу, а потім отримувати значення у списку, використовуючи df.index.tolist(). Так само ви можете використовувати df['col'].tolist()для Series.


Він повертає instanceMethod, а не масив списку
V Shreyas

12
@VShreyas, як щодоdf.index.values.tolist()
LancelotHolmes

3
df.index.tolist()не повертає метод примірника. Він повертає список індексів. Це метод, визначений на індексі панд. Хоча виклик значень спочатку - це можливість, делегування завдання до нумерування - це не виправлення - лише альтернатива.
айхан

51

панди> = 0,24

Знищити своє використання .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не є особливо корисним самостійно, але він забезпечує той же інтерфейс, що і будь-який масив розширень, визначений в пандах або сторонніми бібліотеками.

Отже, підсумовуючи, .arrayповернемося будь-яке

  1. Існуюча ExtensionArrayрезервна копія індексу / серії, або
  2. Якщо є масив NumPy, що підтримує серію, новий ExtensionArrayоб’єкт створюється у вигляді тонкої обгортки над базовим масивом.

Обґрунтування додавання ДВА нових методів
Ці функції були додані в результаті обговорень під двома проблемами GitHub GH19954 та GH23623 .

Конкретно в документах згадується обгрунтування:

[...] з .valuesним було незрозуміло, чи буде повернене значення фактичним масивом, деяким перетворенням його чи одним із користувацьких масивів панди (як Categorical). Наприклад, з PeriodIndex, кожного разу .values створює нові ndarrayоб'єкти періоду. [...]

Ці дві функції спрямовані на поліпшення узгодженості API, що є головним кроком у правильному напрямку.

Нарешті, .valuesне буде застарілим у поточній версії, але я думаю, що це може статися в якийсь момент у майбутньому, тому я б закликав користувачів перейти до новішого API, як тільки можна.


48

Якщо ви маєте справу з багатоіндексним фреймом даних, можливо, вам буде цікаво витягнути лише стовпець одного імені мультиіндексу. Ви можете зробити це як

df.index.get_level_values('name_sub_index')

і звичайно name_sub_indexповинен бути елементомFrozenList df.index.names


16

Оскільки панди v0.13 ви також можете використовувати get_values:

df.index.get_values()

5
Чи є різниця між цим і значеннями? (Я оновив інформацію про версію, оскільки ця функція з’являється з 0,13,0 документа.)
Енді Хейден,

@Andy Hayden: Чи не одна різниця в тому, що .get_values ​​є офіційним способом отримання лише поточних значень, тоді як .values ​​(наприклад, мультиіндекс) може повертати значення індексу, для яких рядки або стовпці були видалені?
Єзекіїль Круглик

@EzekielKruglick, тож це завжди копія? Пов’язана з документацією дуже легка, я не думав, що ви отримаєте такі дупи (навіть якщо вони в МІ, вони не будуть в. Значеннях) було б чудово побачити приклад, який це демонструє!
Енді Хайден

@AndyHayden: Я думаю, що я неправильно читав ваш коментар. Ви маєте рацію, .values ​​- це добре. Оригінальний випуск github: github.com/pydata/pandas/isissue/3686 Але я лише перевірив, і, схоже, значення. (Звичайно!) Дає актуальну інформацію просто в іншій формі, ніж я вважав, про що ми говорили
Ezekiel Kruglick

1
@AndyHayden Ні, різниці немає. get_valuesпросто дзвінки .values. Набирає більше символів.
cs95

0

Я перетворив панд dataframeв listі потім використовувати основний list.index(). Щось на зразок цього:

dd = list(zone[0]) #Where zone[0] is some specific column of the table
idx = dd.index(filename[i])

Ви маєте значення індексу як idx.


а потім використав базовий list.index () Як це пов’язано з питанням перетворення серії в список?
AMC

0

Більш свіжий спосіб зробити це - використовувати функцію .to_numpy ().

Якщо у мене є кадр даних зі стовпцем "ціна", я можу його перетворити так:

priceArray = df['price'].to_numpy()

Ви також можете передавати тип даних, наприклад, float або об'єкт, як аргумент функції


-1

Нижче наводиться простий спосіб перетворення стовпця фрейму даних в масивний масив.

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 (), але це дало мені помилку нижче: TypeError: немає підтримуваної конверсії для типів: (dtype ('O')), роблячи класифікацію бінарної релевантності за допомогою лінійного SVC. to.numpy () перетворював dataFrame в numpy масив, але тип даних внутрішнього елемента був списком, через який спостерігалася вищевказана помилка. В цьому насправді не винна to_numpy.
AMC
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.