2015-06-12 4 views
13

Ho il dataframe mostrato di seguito. Ho bisogno di ottenere il valore scalare della colonna B, dipendente dal valore di A (che è una variabile nel mio script). Sto provando la funzione loc() ma restituisce una serie invece di un valore scalare. Come ottengo il valore scalare()?Come ottenere il valore scalare su una cella usando l'indicizzazione condizionale

>>> x = pd.DataFrame({'A' : [0,1,2], 'B' : [4,5,6]}) 
>>> x 
    A B 
0 0 4 
1 1 5 
2 2 6 

>>> x.loc[x['A'] == 2]['B'] 
2 6 
Name: B, dtype: int64 

>>> type(x.loc[x['A'] == 2]['B']) 
<class 'pandas.core.series.Series'> 
+1

possibile duplicato di [Come ottenere un valore da una cella di un frame di dati?] (Http : //stackoverflow.com/questions/16729574/how-to-get-a-value-from-a-cell-of-a-data-frame) – Noah

+0

Ho letto il post di cui sopra. Il mio problema è la parte indicizzata condizionale (ad esempio, x ['A'] == 2). Non sai come farlo funzionare con at(), iat(). Grazie. – user4979733

risposta

14

Prima di tutto, è meglio accedere entrambi gli indici di riga e di colonna dalla .loc:

x.loc[x['A'] == 2, 'B'] 

secondo luogo, si può sempre ottenere alla matrice NumPy sottostante usando .values su una serie o dataframe:

In : x.loc[x['A'] == 2, 'B'].values[0] 
Out: 6 

UPDATE Se non sei interessato a "ind condizionale della domanda originale exing", c'è anche una funzione specifica progettato per ottenere un singolo valore scalare da un dataframe: dataframe.get_value(index, column)

+0

"è meglio accedere a entrambi gli indici di riga e colonna da .loc" Mi chiedo quale sia la ragione di ciò. Cosa intendi? Perché è meglio del modo in cui sono pubblicati nell'OP? Grazie – user5359531

+0

http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy – Noah

+3

Eseguendo '.values ​​[0]' solo per ottenere il valore effettivo della cella è così goffo. Gli sviluppatori di Pandas dovrebbero davvero migliorare questo. – Jarad

0

Opzione 1
.item()
Questo funziona se le operazioni restituiscono una singola serie di fila.

x.loc[x['A'] == 2, 'B'].item() 
6 

Opzione 2
Utilizzando iloc sul risultato di loc -

x.loc[x['A'] == 2, 'B'].iloc[0] 
6 
Problemi correlati