Filtrar Datos¶
Para filtrar datos en Pandas, se utiliza el método loc()
o iloc()
, dependiendo de si queremos filtrar por etiquetas de índice o por posición. Para efectos prácticos, utilizaremos solo loc()
.
Supongamos que tenemos un DataFrame llamado df
con las columnas "Nombre", "Edad" y "Género", y queremos filtrar los datos para obtener solo las filas donde la edad sea mayor o igual a 18.
Para hacer esto utilizando el método loc()
, podemos utilizar la siguiente línea de código:
import pandas as pd
data = {'Nombre': ['Juan', 'Ana', 'Pedro', 'Maria'],
'Edad': [15, 17, 35, None],
'Género': ['Masculino', 'Femenino', 'Masculino', '-']}
df = pd.DataFrame(data)
df
Nombre | Edad | Género | |
---|---|---|---|
0 | Juan | 15.0 | Masculino |
1 | Ana | 17.0 | Femenino |
2 | Pedro | 35.0 | Masculino |
3 | Maria | NaN | - |
# mayor o igual a 18.
df.loc[df['Edad'] >= 18]
Nombre | Edad | Género | |
---|---|---|---|
2 | Pedro | 35.0 | Masculino |
Para entender mejor los filtros de pandas, separemos el problema. Lo primero será definir la condición:
# crear condicion
valor_objetivo = 18
condicion = (df['Edad'] >= valor_objetivo)
Obsersevemos que la variable condicion
corresponde un panda series con objetos Booleanos.
# ver objetos de la variable condicion
condicion
0 False 1 False 2 True 3 False Name: Edad, dtype: bool
Ahora, al aplicar la varible condicion
al pandas dataframe, esto retornará el dataframe objetivo en donde los ínidices de la condición son verdaderas (True
).
df[condicion]
Nombre | Edad | Género | |
---|---|---|---|
2 | Pedro | 35.0 | Masculino |
# mayor o igual a 18
df[df['Edad'] >= 18]
Nombre | Edad | Género | |
---|---|---|---|
2 | Pedro | 35.0 | Masculino |
Veamos más ejemplos:
# edad entre 0 y 18
df.loc[df['Edad'].between(0,18)]
Nombre | Edad | Género | |
---|---|---|---|
0 | Juan | 15.0 | Masculino |
1 | Ana | 17.0 | Femenino |
# nombre igual a Pedro
df.loc[df['Nombre']=='Pedro']
Nombre | Edad | Género | |
---|---|---|---|
2 | Pedro | 35.0 | Masculino |
Filtrar por múltiples valores¶
podemos utilizar el operador isin()
para filtrar datos por múltiples valores. Por ejemplo, si queremos filtrar solo las filas donde la columna "Género" es "Masculino" o "Femenino", podemos utilizar la siguiente línea de código:
# columna "Género" es "Masculino" o "Femenino"
df[df['Género'].isin(['Masculino', 'Femenino'])]
Nombre | Edad | Género | |
---|---|---|---|
0 | Juan | 15.0 | Masculino |
1 | Ana | 17.0 | Femenino |
2 | Pedro | 35.0 | Masculino |
Filtrar por patrón de texto¶
podemos utilizar el método str.contains()
para filtrar datos por un patrón de texto en una columna. Por ejemplo, si queremos filtrar solo las filas donde la columna "Nombre" contiene la palabra "Juan", podemos utilizar la siguiente línea de código:
# columna "Nombre" contiene la palabra "Juan"
df[df['Nombre'].str.contains('Juan')]
Nombre | Edad | Género | |
---|---|---|---|
0 | Juan | 15.0 | Masculino |
Filtrar por nulos¶
podemos utilizar el método isnull()
para filtrar datos por valores nulos en una columna. Por ejemplo, si queremos filtrar solo las filas donde la columna "Edad" tiene un valor nulo, podemos utilizar la siguiente línea de código:
df[df['Edad'].isnull()]
Nombre | Edad | Género | |
---|---|---|---|
3 | Maria | NaN | - |
al mismo tiempo, podemos filtrar por los datos que NO son nulos con notnull()
df[df['Edad'].notnull()]
Nombre | Edad | Género | |
---|---|---|---|
0 | Juan | 15.0 | Masculino |
1 | Ana | 17.0 | Femenino |
2 | Pedro | 35.0 | Masculino |
Filtrar por varias condiciones¶
podemos utilizar operadores lógicos como &
(and) y |
(or) para combinar varias condiciones de filtrado. Por ejemplo, si queremos filtrar solo las filas donde la columna "Edad" es mayor o igual a 18 y la columna "Género" es "Masculino", podemos utilizar la siguiente línea de código:
df[(df['Edad'] >= 18) & (df['Género'] == 'Masculino')]
Nombre | Edad | Género | |
---|---|---|---|
2 | Pedro | 35.0 | Masculino |
Observación: Una alternativa para filtrar datos es utilizar la notación lambda, la cual resulta más práctica sobre todo cuando el nombre del dataframe es largo.
Veamos unos ejemplos:
data = {'Nombre': ['Juan', 'Ana', 'Pedro', 'Maria'],
'Edad': [15, 17, 35, None],
'Género': ['Masculino', 'Femenino', 'Masculino', '-']}
df_nombre_muy_largo = pd.DataFrame(data)
df_nombre_muy_largo
Nombre | Edad | Género | |
---|---|---|---|
0 | Juan | 15.0 | Masculino |
1 | Ana | 17.0 | Femenino |
2 | Pedro | 35.0 | Masculino |
3 | Maria | NaN | - |
# caso normal
df_nombre_muy_largo.loc[(df_nombre_muy_largo['Edad'] >= 18) & (df_nombre_muy_largo['Género'] == 'Masculino')]
Nombre | Edad | Género | |
---|---|---|---|
2 | Pedro | 35.0 | Masculino |
# caso lambda
df_nombre_muy_largo.loc[lambda x: (x['Edad'] >= 18) & (x['Género'] == 'Masculino')]
Nombre | Edad | Género | |
---|---|---|---|
2 | Pedro | 35.0 | Masculino |