Filtrando Filas
Usa condiciones booleanas para conservar solo las filas que coincidan con tus criterios en un DataFrame de pandas.
- Filtrar filas usando una sola condición booleana
- Combinar varias condiciones con los operadores & y |
- Usar .isin() y .between() para patrones de filtrado comunes
- Filtrar con métodos de cadena usando el accesor .str
Filtrando con condiciones booleanas
Filtrar es la forma de centrarte en el subconjunto de datos que importa. Creas una máscara booleana, una Series de valores True/False, y la usas para seleccionar filas.
import pandas as pd
# titanic.csv ships with the course — load it from the browser file system.
df = pd.read_csv("titanic.csv")
# Filter passengers older than 30
older = df[df["Age"] > 30]
print(older.shape) # fewer rows than original 891La expresión df["Age"] > 30 produce una Series booleana:
0 True
1 True
2 False
3 True
...
Pasarla dentro de df[...] conserva solo las filas donde el valor es True.
Combinando condiciones
Usa & (y) y | (o) para combinar condiciones. Cada condición debe ir entre paréntesis:
# Female passengers in first class
first_class_female = df[(df["Sex"] == "female") & (df["Pclass"] == 1)]
print(first_class_female.head())# Passengers younger than 25 OR older than 60
young_or_old = df[(df["Age"] < 25) | (df["Age"] > 60)]
print(young_or_old.shape)Error común: usar and/or en lugar de &/|. Los operadores and/or de Python no funcionan elemento por elemento sobre las Series de pandas y lanzarán un error.
Usando .isin() para varios valores
Cuando necesitas coincidir con una lista de valores, usa .isin():
# Passengers who embarked from Cherbourg or Southampton
embarked_filter = df[df["Embarked"].isin(["C", "S"])]# Passengers in class 1 or 2
upper_classes = df[df["Pclass"].isin([1, 2])]Usando .between() para rangos
El método .between() es más limpio que encadenar dos comparaciones:
# Passengers aged 20 to 30 (inclusive by default)
twenties = df[df["Age"].between(20, 30)]
print(twenties.shape)Esto es equivalente a df[(df["Age"] >= 20) & (df["Age"] <= 30)] pero más legible.
Filtrando con métodos de cadena
El accesor .str te permite aplicar operaciones de cadena a una columna completa:
# Passengers whose name contains "Master" (a title)
masters = df[df["Name"].str.contains("Master", na=False)]
print(masters.shape)# Passengers whose ticket starts with "A"
a_tickets = df[df["Ticket"].str.startswith("A", na=False)]El parámetro na=False maneja los valores faltantes con elegancia, sin él, las entradas NaN causarían errores.
Filtrando con .query()
Para filtros complejos, .query() ofrece una alternativa legible:
# Equivalent to df[(df["Age"] > 25) & (df["Survived"] == 1)]
survivors_over_25 = df.query("Age > 25 and Survived == 1")Esto se lee casi como inglés y evita la sintaxis repetitiva df["column"].
Almacenando filtros en variables
Para condiciones complejas, guarda la máscara booleana en una variable primero:
is_female = df["Sex"] == "female"
is_first_class = df["Pclass"] == 1
is_survived = df["Survived"] == 1
# Combine them
result = df[is_female & is_first_class & is_survived]
print(f"Female first-class survivors: {len(result)}")Este enfoque hace que tu código sea mucho más fácil de leer y depurar.
Inténtalo
Del conjunto de datos del Titanic, filtra para encontrar:
- Todos los pasajeros que pagaron más de 100 en tarifa
- Todas las pasajeras en tercera clase
- Todos los pasajeros con el título “Mrs” en su nombre
import pandas as pd
# titanic.csv ships with the course — load it from the browser file system.
df = pd.read_csv("titanic.csv")
high_fare = df[df["Fare"] > 100]
print(f"High fare passengers: {len(high_fare)}")
third_class_female = df[(df["Sex"] == "female") & (df["Pclass"] == 3)]
print(f"Third-class females: {len(third_class_female)}")
mrs = df[df["Name"].str.contains("Mrs", na=False)]
print(f"Passengers with title Mrs: {len(mrs)}")Conclusiones clave
- La indexación booleana
df[mask]es el mecanismo principal de filtrado en pandas - Usa
¶ Y,|para O, envuelve siempre las condiciones individuales entre paréntesis .isin()coincide con una lista;.between()maneja rangos con limpieza.str.contains()filtra por coincidencia de subcadena, usana=Falsepor seguridad
Desafío de práctica
Del conjunto de datos del Titanic, encuentra todos los pasajeros que: (1) fueran hombres, (2) estuvieran en segunda o tercera clase, (3) tuvieran entre 18 y 35 años, y (4) sobrevivieran. ¿Cuántos pasajeros cumplen las cuatro condiciones?
1. ¿Cómo filtras las filas donde edad > 30?
2. ¿Qué devuelve df[df.age > 30]?
3. ¿Cómo filtras con varias condiciones?