Як отримати значення з DataFrame Pandas, а не індекс та тип об'єкта


104

Скажіть, у мене є така DataFrame

Літерний номер
А 1
Б 2
C 3
D 4

Які можна отримати за допомогою наступного коду

import pandas as pd

letters=pd.Series(('A', 'B', 'C', 'D'))
numbers=pd.Series((1, 2, 3, 4))
keys=('Letters', 'Numbers')
df=pd.concat((letters, numbers), axis=1, keys=keys)

Тепер я хочу отримати значення C зі стовпця Letters.

Командний рядок

df[df.Letters=='C'].Letters

повернеться

2 С
Назва: Букви, тип: об’єкт

Як я можу отримати лише значення C, а не цілий два рядки?


6
На непов’язаній ноті є кращий спосіб скласти свої DataFrame:pd.DataFrame({'Letters': letters, 'Numbers': numbers})
JoeCondron,

Відповіді:


144
df[df.Letters=='C'].Letters.item()

Це повертає перший елемент у Index / Series, повернутий з цього вибору. У цьому випадку значення завжди є першим елементом.

Редагувати:

Або ви можете запустити loc () та отримати доступ до першого елемента таким чином. Це було коротше, і це те, як я його реалізував у минулому.


2
Я люблю цей метод, однак отримую попередження:FutureWarning: "item" has been deprecated and will be removed in a future version
AlexG

2
@AlexG: ви можете використовувати замість цього: df[df.Letters=='C'].Letters.iloc[0]. Він створює перший елемент (який також є унікальним) в результативній серії.
Ан-Тхі

з використанням loc [: 1] все ще відображається індекс поруч зі значенням :(
Sonic Soul

@AlexG та @Sonic Soul: спробуйте використовувати df[df.Letters=='C'].Letters.squeeze()замість цього. Це працює так само. :)
user78910

52

Використовуйте valuesатрибут для повернення значень у вигляді масиву np, а потім використовуйте [0]для отримання першого значення:

In [4]:
df.loc[df.Letters=='C','Letters'].values[0]

Out[4]:
'C'

EDIT

Я особисто віддаю перевагу доступу до стовпців за допомогою операторів підписки:

df.loc[df['Letters'] == 'C', 'Letters'].values[0]

Це дозволяє уникнути проблем, де в назвах стовпців можуть бути пробіли чи тире, -що означають, що для доступу використовувати ..


1
Я особисто не використовую .для доступу до стовпців, оскільки це не завжди буде працювати, наприклад, якщо ім'я стовпця починається з числового значення або в назві стовпців є не алфавітні символи, такі як пробіл, тому я завжди віддаю перевагуdf['col_name']
EdChum

Я бачу. Ось чому скрізь, де я дивлюся, я завжди знаходив df['col_name']позначення замість .позначення. Знову дякую.
Едуардо

1
Це насправді несуттєво, але у виборі ви отримуєте доступ до стовпця "Букви", використовуючи крапкові позначення; df.loc [df.Letters == 'C']. Якщо у назвах стовпців є пробіли, ви, ймовірно, використовуєте перетворювачі, щоб викреслити їх, як, наприклад, при імпорті з CSV або Excel-файлу.
valkn0t

@ thomas-ato Я оновлю свою відповідь, але я не погоджуюся з модифікацією стовпців як додатковий крок, якщо це не потрібно, і в цьому випадку я погоджуюся, що це не має ніякого значення
EdChum

1
import pandas as pd

dataset = pd.read_csv("data.csv")
values = list(x for x in dataset["column name"])

>>> values[0]
'item_0'

редагувати:

насправді ви можете просто проіндексувати набір даних, як будь-який старий масив.

import pandas as pd

dataset = pd.read_csv("data.csv")
first_value = dataset["column name"][0]

>>> print(first_value)
'item_0'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.