Come ottenere un valore da un Pandas DataFrame e non dall'indice e dal tipo di oggetto


104

Diciamo che ho il seguente DataFrame

Numero lettera
A 1
B 2
C 3
D 4

Che può essere ottenuto tramite il seguente codice

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)

Ora voglio ottenere il valore C dalla colonna Lettere.

La riga di comando

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

sarà di ritorno

2 C
Nome: lettere, dtype: oggetto

Come posso ottenere solo il valore C e non l'intera uscita di due righe?


6
In una nota non correlata, c'è un modo migliore per costruire il tuo DataFrame:pd.DataFrame({'Letters': letters, 'Numbers': numbers})
JoeCondron

Risposte:


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

Ciò restituisce il primo elemento nell'Indice / Serie restituito da quella selezione. In questo caso, il valore è sempre il primo elemento.

MODIFICARE:

Oppure puoi eseguire loc () e accedere al primo elemento in questo modo. Questo era più breve ed è il modo in cui l'ho implementato in passato.


2
Adoro questo metodo, tuttavia ricevo l'avvertimento:FutureWarning: "item" has been deprecated and will be removed in a future version
AlexG

2
@AlexG: è possibile utilizzare questo, invece: df[df.Letters=='C'].Letters.iloc[0]. Produce il primo elemento (che è anche l'unico) nella serie dei risultati.
Anh-Thi DINH

utilizzando loc [: 1] mostra ancora l'indice accanto al valore :(
Sonic Soul

@AlexG e @Sonic Soul: prova a usare df[df.Letters=='C'].Letters.squeeze()invece. Funziona allo stesso modo. :)
user78910

52

Usa l' valuesattributo per restituire i valori come un array np e poi usa [0]per ottenere il primo valore:

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

Out[4]:
'C'

MODIFICARE

Personalmente preferisco accedere alle colonne utilizzando operatori di pedice:

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

Ciò evita problemi in cui i nomi delle colonne possono contenere spazi o trattini, il -che significa che l'accesso utilizzando ..


1
Personalmente non uso il .per accedere alle colonne in quanto questo non funzionerà sempre, ad esempio se il nome della colonna inizia con un valore numerico o se ci sono caratteri non df['col_name']
alfabetici

Vedo. Ecco perché ovunque guardo, ho sempre trovato la df['col_name']notazione invece della .notazione. Grazie ancora.
Eduardo

1
È davvero irrilevante, ma nella tua selezione accedi alla colonna "Lettere" utilizzando la notazione del punto; df.loc [df.Letters == 'C']. Se sono presenti spazi nei nomi delle colonne, probabilmente dovresti utilizzare i convertitori per rimuoverli, come faresti se importassi da un file CSV o Excel.
valkn0t

@ thomas-ato Aggiornerò la mia risposta ma non sono d'accordo con la modifica delle colonne come passaggio aggiuntivo a meno che non sia necessario, in questo caso sono d'accordo che non fa differenza
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'

modificare:

in realtà, puoi semplicemente indicizzare il set di dati come qualsiasi vecchio array.

import pandas as pd

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

>>> print(first_value)
'item_0'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.