Come ottenere un valore da una cella di un frame di dati?


347

Ho creato una condizione che estrae esattamente una riga dal mio frame di dati:

d2 = df[(df['l_ext']==l_ext) & (df['item']==item) & (df['wn']==wn) & (df['wd']==1)]

Ora vorrei prendere un valore da una colonna particolare:

val = d2['col_name']

Ma di conseguenza ottengo un frame di dati che contiene una riga e una colonna ( ovvero una cella). Non è quello di cui ho bisogno. Ho bisogno di un valore (un numero float). Come posso farlo in Panda?


1
Se hai provato alcune di queste risposte ma SettingWithCopyWarninghai finito con un , puoi dare un'occhiata a questo post per una spiegazione dell'avvertimento e possibili soluzioni / soluzioni alternative.
cs95,

Risposte:


430

Se si dispone di un DataFrame con una sola riga, accedere alla prima (unica) riga come Serie utilizzando iloce quindi al valore utilizzando il nome della colonna:

In [3]: sub_df
Out[3]:
          A         B
2 -0.133653 -0.030854

In [4]: sub_df.iloc[0]
Out[4]:
A   -0.133653
B   -0.030854
Name: 2, dtype: float64

In [5]: sub_df.iloc[0]['A']
Out[5]: -0.13365288513107493

1
@Sophologist guardando questo, non ne ho idea. La domanda è un po 'stranamente formulata, ma sembra che la prima metà sia irrilevante per la seconda. ( atè davvero una bella risposta, anche se lo trovo strano è come ix:))
Andy Hayden,

9
@Sophologist Sono d'accordo sul fatto che è ridicolo che ciò sia necessario. Inoltre, non funziona quando si tenta di passare i condizionali in linea; my_df.loc[my_df['Col1'] == foo]['Col2']restituisce ancora un oggetto di tipo<class 'pandas.core.series.Series'>
user5359531

16
Nota che questa soluzione restituisce una serie, non un valore!
Atte Juvonen,

1
@AtteJuvonen Dipende se hai duplicati nell'indice / nelle colonne (nota in / iat solleva un'eccezione con colonne duplicate, presenterà un problema).
Andy Hayden,

1
strano. Continuo a leggere loc è per i nomi e iloc è per gli interi, ma qui è iloc sia per intero che per nome
mLstudent33

205

Questi sono un accesso rapido per gli scalari

In [15]: df = pandas.DataFrame(numpy.random.randn(5,3),columns=list('ABC'))

In [16]: df
Out[16]: 
          A         B         C
0 -0.074172 -0.090626  0.038272
1 -0.128545  0.762088 -0.714816
2  0.201498 -0.734963  0.558397
3  1.563307 -1.186415  0.848246
4  0.205171  0.962514  0.037709

In [17]: df.iat[0,0]
Out[17]: -0.074171888537611502

In [18]: df.at[0,'A']
Out[18]: -0.074171888537611502

9
Mi piace molto questa risposta. Ma mentre puoi fare .iloc[-1]['A']non puoi fare at[-1,'A']per ottenere l'ultima voce della riga
hartmut,

3
questa dovrebbe essere la risposta perché non copiamo in memoria una linea inutile per ottenere solo un elemento all'interno.
Bormat,

3
@hartmut Puoi sempre farloat[df.index[-1],'A']
cs95

105

Puoi trasformare il tuo frame di dati 1x1 in una matrice numpy, quindi accedere al primo e unico valore di quella matrice:

val = d2['col_name'].values[0]

10
Per favore, migliora la qualità della tua risposta con qualche spiegazione in più.
Franck Gamess,

Modifica la tua risposta iniziale con questa prima di creare un commento. Grazie
Franck Gamess il

2
Preferisco questo metodo e lo uso frequentemente. Usato anche per l'uso .get_values()[0].
Aaronpenne,

3
Penso che questa sia la risposta migliore dal momento che non restituisce un pandas.series, ed è la più semplice.
Sean McCarthy,

Che vantaggio ha questo rispetto ai metodi forniti da Panda?
AMC

28

La maggior parte delle risposte utilizza ciò ilocche è buono per la selezione per posizione.

Se hai bisogno di una selezione per etichetta loc sarebbe più conveniente.

Per ottenere esplicitamente un valore (equivale a df.get_value obsoleto ('a', 'A'))

# this is also equivalent to df1.at['a','A']
In [55]: df1.loc['a', 'A'] 
Out[55]: 0.13200317033032932

18

Avevo bisogno del valore di una cella, selezionato per nomi di colonna e indice. Questa soluzione ha funzionato per me:

original_conversion_frequency.loc[1,:].values[0]


16

Sembra cambiamenti dopo i panda 10.1 / 13.1

Ho aggiornato da 10.1 a 13.1, prima che iloc non fosse disponibile.

Ora con 13.1, iloc[0]['label']ottiene un array a valore singolo anziché uno scalare.

Come questo:

lastprice=stock.iloc[-1]['Close']

Produzione:

date
2014-02-26 118.2
name:Close, dtype: float64

Penso che questo dovrebbe valere solo per le serie con voci duplicate ... in effetti, non lo vedo, potresti fare un piccolo esempio per dimostrarlo?
Andy Hayden,

ho usato Panda 13.x, sia iloc [] [] che iloc [,] emettono uno scalare. solo il iloc non funziona con indice negativo, come -1
timeislove

Se puoi dare un esempio di giocattolo dimostrandolo nella risposta, sarebbe davvero utile!
Andy Hayden,

5

Le opzioni più veloci / facili che ho trovato sono le seguenti. 501 rappresenta l'indice di riga.

df.at[501,'column_name']
df.get_value(501,'column_name')

5
get_valueè deprecato ora (v0.21.0 RC1 (13 ottobre 2017)) il riferimento è qui .get_value and .set_value on Series, DataFrame, Panel, SparseSeries, and SparseDataFrame are deprecated in favor of using .iat[] or .at[] accessors (GH15269)
Shihe Zhang

4

Per i panda 0.10, dove non ilocè possibile, filtrare a DFe ottenere i dati della prima riga per la colonna VALUE:

df_filt = df[df['C1'] == C1val & df['C2'] == C2val]
result = df_filt.get_value(df_filt.index[0],'VALUE')

se è stata filtrata più di 1 riga, ottenere il valore della prima riga. Ci sarà un'eccezione se il filtro risulta in un frame di dati vuoto.


3
get_valueè deprecato ora (v0.21.0 RC1 (13 ottobre 2017)) il riferimento è qui .get_value and .set_value on Series, DataFrame, Panel, SparseSeries, and SparseDataFrame are deprecated in favor of using .iat[] or .at[] accessors (GH15269)
Shihe Zhang

Ma iato atnon è possibile ottenere il valore in base al nome della colonna.
sivabudh,

4

Non sono sicuro che questa sia una buona pratica, ma ho notato che posso anche ottenere il valore lanciando la serie come float.

per esempio

rate

3 0.042679

Nome: Unemployment_rate, tipo: float64

float(rate)

0.0426789


Funziona anche con una serie multi-elemento?
Prassitele


-1
df_gdp.columns

Indice ([u'Paese ', u'Codice paese', u''Indicator Name ', u''Indicator Code', u'1960 ', u'1961', u'1962 ', u'1963', u'1964 ' , u'1965 ', u'1966', u'1967 ', u'1968', u'1969 ', u'1970', u'1971 ', u'1972', u'1973 ', u'1974' , u'1975 ', u'1976', u'1977 ', u'1978', u'1979 ', u'1980', u'1981 ', u'1982', u'1983 ', u'1984' , u'1985 ', u'1986', u'1987 ', u'1988', u'1989 ', u'1990', u'1991 ', u'1992', u'1993 ', u'1994' , u'1995 ', u'1996', u'1997 ', u'1998', u'1999 ', u'2000',u'2001 ', u'2002', u'2003 ', u'2004', u'2005 ', u'2006', u'2007 ', u'2008', u'2009 ', u'2010', u'2011 ', u'2012', u'2013 ', u'2014', u'2015 ', u'2016'], dtype = 'object')

df_gdp[df_gdp["Country Code"] == "USA"]["1996"].values[0]

8100000000000,0


4
È una risposta o una domanda?
Vega,

4
Benvenuto in Stack Overflow! Grazie per lo snippet di codice, che potrebbe fornire un aiuto limitato e immediato. Una spiegazione adeguata migliorerebbe notevolmente il suo valore a lungo termine descrivendo perché questa è una buona soluzione al problema e la renderebbe più utile ai futuri lettori con altre domande simili. Modifica la tua risposta per aggiungere alcune spiegazioni, inclusi i presupposti che hai formulato.
sepehr,

Nonostante i voti negativi, questa risposta mi ha davvero aiutato.
CONvocato
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.