Ho costruito 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 come risultato ottengo un data frame che contiene una riga e una colonna (i.e. una cella). Non è quello di cui ho bisogno. Ho bisogno di un valore (un numero float). Come posso farlo in pandas?
Se avete un DataFrame con una sola riga, allora accedete alla prima (unica) riga come serie usando iloc
, e poi il valore usando 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
Questi sono accessi veloci 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
Sembra che i cambiamenti dopo pandas 10.1/13.1
Ho aggiornato da 10.1 a 13.1, prima iloc non è disponibile.
Ora con la 13.1, iloc[0]['label']
ottiene un array a valore singolo piuttosto che uno scalare.
In questo modo:
lastprice=stock.iloc[-1]['Close']
Uscita:
date
2014-02-26 118.2
name:Close, dtype: float64