Extraiga el valor de la columna en función de otra columna en Pandas

3 minutos de lectura

avatar de usuario
Gejun

Me estoy quedando atascado extrayendo el valor de una variable condicionando otra variable. Por ejemplo, el siguiente marco de datos:

A  B
p1 1
p1 2
p3 3
p2 4

¿Cómo puedo obtener el valor de A cuando B=3? Cada vez que extraía el valor de Aobtuve un objeto, no una cadena.

  • Ya veo, debo agregar item() al final.

    – Gejun

    18 de abril de 2016 a las 1:23

  • df.query y pd.eval parecen buenos ajustes para este caso de uso. Para obtener información sobre el pd.eval() familia de funciones, sus características y casos de uso, visite Evaluación de expresiones dinámicas en pandas usando pd.eval().

    – cs95

    16 de diciembre de 2018 a las 4:58

podrías usar loc para obtener series que satisfagan su condición y luego iloc para obtener el primer elemento:

In [2]: df
Out[2]:
    A  B
0  p1  1
1  p1  2
2  p3  3
3  p2  4

In [3]: df.loc[df['B'] == 3, 'A']
Out[3]:
2    p3
Name: A, dtype: object

In [4]: df.loc[df['B'] == 3, 'A'].iloc[0]
Out[4]: 'p3'

  • Gracias por tu ayuda. df.loc[df['B'] == 3, 'A'].item() funciona para mí también.

    – Gejun

    18 de abril de 2016 a las 18:08

  • ¿Cuál elige si el marco de datos tiene múltiples entradas de ‘3’ en la columna B?

    – bananagator

    28/10/2018 a las 21:56

  • df.loc[df[“Condition_Column”] == 0, (“Column_1”, “Column_2, “Column_3”, “Column_4”)]funciona para mí. Este ejemplo para seleccionar varias columnas. Deben estar en tupla.

    – Mustafa Uçar

    12 de diciembre de 2018 a las 7:30

  • .item() aparentemente ha quedado en desuso y se eliminará. Hay otra manera de hacer esto? No me interesa el nombre de la columna o el tipo de datos que también se devuelve con el método .loc para consultar.

    – Dan

    14 de agosto de 2020 a las 12:46

  • @Sulphur necesita envolver las declaraciones secundarias con (). df.loc[(df['B'] == 3) & (df['C'] == 6), 'A'].item() Deberia trabajar.

    – Gejun

    11 de mayo de 2021 a las 3:33

avatar de usuario
PhilChang

Puedes probar queryque es menos escribir:

df.query('B==3')['A']

  • La consulta es interesante porque también podemos agregarle cláusulas más complejas.

    – Samir Baid

    09/07/2018 a las 20:00

  • En mi humilde opinión, esta es la mejor respuesta.

    – NLR

    26 de abril de 2019 a las 15:51

  • @NLR Depende. query crea un nuevo DataFramey luego la rebanada ['A'] crea otro DataFrame. Para casos grandes, uno quisiera evitar el objeto intermedio innecesario.

    – Boj

    11 de agosto de 2021 a las 20:12

df[df['B']==3]['A']asumiendo que df es tu pandas.DataFrame.

  • ¿Puede dar un enlace donde se describe exactamente este método en la documentación oficial de pandas?

    – vasili111

    14 de mayo de 2020 a las 3:12

  • quiero decir ][ part.

    – vasili111

    May 14, 2020 at 3:37

  • @vasili111 check pandas filter

    – JaySabir

    Dec 11, 2020 at 9:35

  • Add a .item() in the end.

    – Debvrat Varshney

    Dec 2, 2021 at 17:05

user avatar
Baz

Use df[df['B']==3]['A'].valores[0] si solo quiere el artículo en sí mismo sin los corchetes

avatar de usuario
DrT

editado: Lo que describí a continuación en Anterior es una indexación encadenada y es posible que no funcione en algunas situaciones. La mejor práctica es usar loc, pero el concepto es el mismo:

df.loc[row, col]

fila y columna se puede especificar directamente (por ejemplo, ‘A’ o [‘A’, ‘B’]) o con una máscara (por ejemplo, df[‘B’] == 3). Usando el siguiente ejemplo:

df.loc[df['B'] == 3, 'A']

Anterior: Es más fácil para mí pensar en estos términos, pero tomando prestado de otras respuestas. El valor que desea se encuentra en un marco de datos:

df[*column*][*row*]

dónde columna y fila apunte a los valores que desea devolver. Para tu ejemplo, columna es ‘A’ y para fila usas una máscara:

df['B'] == 3

Para obtener el primer valor coincidente de la serie, hay varias opciones:

df['A'][df['B'] == 3].values[0]
df['A'][df['B'] == 3].iloc[0]
df['A'][df['B'] == 3].to_numpy()[0]

avatar de usuario
robsiemb

male_avgtip=(tips_data.loc[tips_data['sex'] == 'Male', 'tip']).mean()

También he trabajado en esta clausura y operaciones de extracción para mi encargo.

Puedes usar squeeze en vez de iloc[0]. Se ve más claro si solo tiene un valor:

df.loc[df['B'] == 3, 'A'].squeeze()

Producción:

'p3'

¿Ha sido útil esta solución?