Solución:
Hay varias formas de seleccionar filas de un marco de datos de Pandas:
- Indexación booleana (DataFrame[DataFrame[‘col’] == valor])
- Indexación posicional (DataFrame.iloc[…])
- Indexación de etiquetas (DataFrame.xs (…))
- API DataFrame.query (…)
A continuación les muestro ejemplos de cada uno, con consejos sobre cuándo utilizar determinadas técnicas. Supongamos que nuestro criterio es la columna ‘A’ == ‘barra’
Configuración
Lo primero que necesitaremos es identificar una condición que actuará como nuestro criterio para seleccionar filas. Empezaremos con el caso del OP. column_name == some_value
e incluyen algunos otros casos de uso comunes.
Un ejemplo sería:
import pandas as pd, numpy as np
df = pd.DataFrame({
'A':
'Contrary bar popular bar Lorem bar Ipsum is not simply'.split(),
'B':
'Lorem Ipsum comes from sections one two three four five'.split(),
'C':
np.arange(10),
'D':
np.arange(10) * 2
})
print(df)
Producción:
A B C D
0 Contrary Lorem 0 0
1 bar Ipsum 1 2
2 popular comes 2 4
3 bar from 3 6
4 Lorem sections 4 8
5 bar one 5 10
6 Ipsum two 6 12
7 is three 7 14
8 not four 8 16
9 simply five 9 18
Método 1: indexación booleana (DataFrame[DataFrame[‘col’] == valor]) #
Esta es una de las formas más sencillas de realizar esta tarea y si el rendimiento o la intuición no son un problema, este debería ser su método elegido. Sin embargo, si el rendimiento es un problema, es posible que desee considerar una forma alternativa de crear la máscara.
mask = df['A'] == 'bar'
print(mask)
Producción:
A B C D
1 bar Ipsum 1 2
3 bar from 3 6
5 bar one 5 10
Método 2: indexación posicional (DataFrame.iloc[…]) #
Indexación posicional (DataFrame.iloc[…]) tiene sus casos de uso, pero este no es uno de ellos. Para identificar dónde dividir, primero debemos realizar el mismo análisis booleano que hicimos anteriormente. Esto nos deja realizando un paso adicional para lograr la misma tarea.
mask = df['A'] == 'bar'
pos = np.flatnonzero(mask)
print(df.iloc[pos])
Salida igual que el método anterior:
A B C D
1 bar Ipsum 1 2
3 bar from 3 6
5 bar one 5 10
Método 3: indexación de etiquetas (DataFrame.xs (…)) #
La indexación de etiquetas puede ser muy útil, pero en este caso, nuevamente estamos trabajando más sin ningún beneficio.
res = df.set_index('A', append=True, drop=False).xs('bar', level=1)
print(res)
Salida igual que los métodos anteriores:
A B C D
1 bar Ipsum 1 2
3 bar from 3 6
5 bar one 5 10
Método 4: DataFrame.query (…) API #
pd.DataFrame.query es una forma muy elegante / intuitiva de realizar esta tarea, pero suele ser más lenta. Sin embargo, si presta atención a los siguientes tiempos, para datos grandes, la consulta es muy eficiente. Más que el enfoque estándar y de similar magnitud como mi mejor sugerencia.
res = df.query('A == "bar"')
print(res)
Salida igual que los métodos anteriores:
A B C D
1 bar Ipsum 1 2
3 bar from 3 6
5 bar one 5 10