¿Cómo obtener un valor de una celda de un marco de datos?

He construido una condición que extrae exactamente una fila de mi marco de datos:

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

Ahora me gustaría tomar un valor de una columna en particular:

val = d2['col_name']

Pero como resultado obtengo un marco de datos que contiene una fila y una columna (es decir una celda). No es lo que necesito. Necesito un valor (un número flotante). ¿Cómo puedo hacerlo en pandas?

Solución

Si tienes un DataFrame con una sola fila, entonces accede a la primera (única) fila como una Serie usando iloc, y luego al valor usando el nombre de la columna:

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
Comentarios (4)

Son accesos rápidos para escalares

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
Comentarios (3)

Parece que los cambios después de pandas 10.1/13.1

He actualizado de 10.1 a 13.1, antes de iloc no está disponible.

Ahora con 13.1, iloc[0]['label'] obtiene un array de un solo valor en lugar de un escalar.

Así:

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

Salida:

date
2014-02-26 118.2
name:Close, dtype: float64
Comentarios (3)