Jak uzyskać wartość z Pandas DataFrame, a nie z indeksu i typu obiektu

104

Powiedzmy, że mam następującą ramkę DataFrame

Numer listu
A 1
B 2
C 3
D 4

Który można uzyskać za pomocą następującego kodu

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)

Teraz chcę uzyskać wartość C z kolumny Litery.

Wiersz poleceń

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

wróci

2 C
Nazwa: litery, dtype: przedmiot

Jak mogę uzyskać tylko wartość C, a nie całe dwa wyjścia liniowe?

Eduardo
źródło
6
Z drugiej strony, istnieje lepszy sposób na skonstruowanie ramki DataFrame:pd.DataFrame({'Letters': letters, 'Numbers': numbers})
JoeCondron,

Odpowiedzi:

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

Zwraca pierwszy element indeksu / serii zwrócony z tego wyboru. W tym przypadku wartość jest zawsze pierwszym elementem.

EDYTOWAĆ:

Lub możesz uruchomić loc () i uzyskać w ten sposób dostęp do pierwszego elementu. To było krótsze i tak to wdrażałem w przeszłości.

valkn0t
źródło
2
Uwielbiam tę metodę, ale otrzymuję ostrzeżenie:FutureWarning: "item" has been deprecated and will be removed in a future version
AlexG,
2
@AlexG: można użyć zamiast tego: df[df.Letters=='C'].Letters.iloc[0]. Tworzy pierwszy element (który jest również unikalny) w serii wyników.
Anh-Thi DINH
using loc [: 1] nadal pokazuje indeks obok wartości :(
Sonic Soul
@AlexG i @Sonic Soul: spróbuj df[df.Letters=='C'].Letters.squeeze()zamiast tego. Działa to w ten sam sposób. :)
user78910
52

Użyj valuesatrybutu, aby zwrócić wartości jako tablicę np, a następnie użyj, [0]aby uzyskać pierwszą wartość:

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

Out[4]:
'C'

EDYTOWAĆ

Osobiście wolę uzyskać dostęp do kolumn za pomocą operatorów indeksu dolnego:

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

Pozwala to uniknąć problemów, w których nazwy kolumn mogą zawierać spacje lub myślniki, -co oznacza, że ​​dostęp za pomocą ..

EdChum
źródło
1
Osobiście nie używam .do uzyskania dostępu do kolumn, ponieważ nie zawsze będzie to działać, na przykład, jeśli nazwa kolumny zaczyna się od wartości numerycznej lub występują znaki inne niż alfa, takie jak spacja, więc zawsze wolędf['col_name']
EdChum
Widzę. Dlatego wszędzie, gdzie spojrzę, zawsze znajdowałem df['col_name']notację zamiast .notacji. Dzięki jeszcze raz.
Eduardo,
1
To naprawdę nieistotne, ale w swoim wyborze uzyskujesz dostęp do kolumny „Litery” za pomocą notacji kropkowej; df.loc [df.Letters == 'C']. Jeśli w nazwach kolumn są spacje, prawdopodobnie powinieneś użyć konwerterów, aby je usunąć, tak jak w przypadku importowania z pliku CSV lub Excel.
valkn0t
@ thomas-ato Zaktualizuję swoją odpowiedź, ale nie zgadzam się z modyfikowaniem kolumn jako dodatkowym krokiem, chyba że jest to konieczne, w tym przypadku zgadzam się, że nie ma to znaczenia
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'

edytować:

w rzeczywistości możesz po prostu zindeksować zestaw danych jak każdą starą tablicę.

import pandas as pd

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

>>> print(first_value)
'item_0'
Chwytak
źródło