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

5 minutos de lectura

avatar de usuario
romano

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?

  • Si probó algunas de estas respuestas pero terminó con una SettingWithCopyWarningpuede echar un vistazo a esta publicación para obtener una explicación de la advertencia y posibles soluciones alternativas.

    – cs95

    22 de enero de 2019 a las 23:52

  • df['col'].iloc[0] es más rápido que df.iloc[0]['col']

    – Vipul

    12 de marzo a las 11:12


avatar de usuario
Andy Hayden

Si tiene un DataFrame con solo una fila, acceda a la primera (única) fila como Serie usando ilocy luego el 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

  • @Sophologist Estoy de acuerdo en que es ridículo que esto sea necesario. Tampoco funciona cuando intenta pasar los condicionales en línea; my_df.loc[my_df['Col1'] == foo]['Col2'] todavía devuelve un objeto de tipo <class 'pandas.core.series.Series'>

    – usuario5359531

    18 de noviembre de 2016 a las 3:54


  • ¡Tenga en cuenta que esta solución devuelve una Serie, no un valor!

    – Atte Juvonen

    6 de febrero de 2017 a las 12:12


  • @AtteJuvonen Eso depende si tiene duplicados en su índice/columnas (tenga en cuenta que at/iat genera una excepción con columnas duplicadas, presentará un problema).

    –Andy Hayden

    06/02/2017 a las 19:30

  • extraño. Sigo leyendo loc es para nombres e iloc es para números enteros, pero aquí está iloc tanto para números enteros como para nombres.

    – mlestudiante33

    13 de marzo de 2020 a las 21:26

  • @mLstudent33 Es iloc para la llamada a la fila, y luego se le da el nombre de la columna

    – Liz

    22 de abril de 2021 a las 13:43

avatar de usuario
jeff

Estos son métodos de acceso rápido 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

  • Me gusta mucho esta respuesta. Pero mientras que puedes hacer .iloc[-1]['A'] tú no puedes hacer at[-1,'A'] para obtener la entrada de la última fila

    – Hartmut

    16 de enero de 2018 a las 9:25

  • esta debería ser la respuesta porque no copiamos en la memoria una línea inútil para obtener solo un elemento dentro.

    – borrado

    21 de junio de 2018 a las 17:54

  • @hartmut Siempre puedes simplemente hacer at[df.index[-1],'A']

    – cs95

    22 de enero de 2019 a las 23:51

  • Me gusta más esta respuesta. También puede hacer referencia a índices con nombre, lo que hace que su código sea más legible: df.at['my_row_name', 'my_column_name']

    – LunkRat

    30 abr a las 20:14

avatar de usuario
Guillaume

Puede convertir su marco de datos 1×1 en un NumPy matriz, luego acceda al primer y único valor de esa matriz:

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

  • Prefiero este método y lo uso con frecuencia. solía usar .get_values()[0] también.

    – aaronpenne

    12/07/2018 a las 20:41

  • Creo que esta es la mejor respuesta ya que no devuelve pandas.series, y es la más simple.

    – Sean McCarthy

    30 de junio de 2019 a las 23:33

  • ¿Qué ventaja tiene esto sobre los métodos proporcionados por Pandas?

    – AMC

    7 de febrero de 2020 a las 2:28

  • En mi opinión personal, esto es hinchazón. Uno debe buscar el camino más simple y nunca incluir marcos o bibliotecas innecesarias, incluso si son excelentes para hacer su trabajo.

    – Roble_3260548

    28 de julio de 2020 a las 20:19

  • A partir de ahora, esto también funciona en pandas, no es necesario tener ventaja sobre los métodos disponibles en pandas, es un método disponible en pandas.

    – joey

    27 de octubre de 2020 a las 1:46


avatar de usuario
Shihe Zhang

La mayoría de las respuestas están usando iloc lo cual es bueno para la selección por posición.

Si necesitas selección por etiqueta, ubicación sería más conveniente.

Para obtener un valor explícitamente (equivalente a obsoleto df.get_value(‘a’,’A’))

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

No tiene por qué ser complicado:

val = df.loc[df.wd==1, 'col_name'].values[0]

  • básicamente repitiendo lo que dijo Natacha el 27 de octubre de 2018… y Guillaume el 25 de junio de 2018 antes de eso

    – Jaime

    29 de enero de 2021 a las 4:53


  • ¿Cómo es que eso no es complicado? Simple sería df.at[r, col]

    – Resplandor

    23 de noviembre de 2021 a las 10:05


avatar de usuario
Natacha

Necesitaba el valor de una celda, seleccionada por nombres de columna e índice. Esta solución funcionó para mí:

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

  • básicamente repitiendo lo que dijo Natacha el 27 de octubre de 2018… y Guillaume el 25 de junio de 2018 antes de eso

    – Jaime

    29 de enero de 2021 a las 4:53


  • ¿Cómo es que eso no es complicado? Simple sería df.at[r, col]

    – Resplandor

    23 de noviembre de 2021 a las 10:05


avatar de usuario
Pedro Mortensen

Parecen cambios después de pandas 10.1 o 13.1.

Actualicé de 10.1 a 13.1. Antes, iloc no está disponible.

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

Como esto:

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

Producción:

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

  • Creo que este solo debería ser el caso de Series con entradas duplicadas… de hecho, no veo esto, ¿podría dar un pequeño ejemplo para demostrarlo?

    –Andy Hayden

    7 oct 2014 a las 16:09

  • usé pandas 13.x, ambos iloc[][] o iloc[,] salida de un escalar. solo el iloc no funciona con un índice negativo, como -1

    – tiempo es amor

    10 de octubre de 2014 a las 6:49


  • Si puede dar un ejemplo de juguete que demuestre esto en la respuesta, ¡sería realmente útil!

    –Andy Hayden

    10 de octubre de 2014 a las 7:04

¿Ha sido útil esta solución?