Función Pandas df.filter()
filter()es una función de Pandas para filtrar columnas (no filas). Puede seleccionar columnas específicas según nombres de columna, patrones de etiqueta o expresiones regulares. A diferencia deloc[]yiloc[]diferente,filter()está específicamente diseñada para la selección de columnas, lo cual es muy útil al trabajar con conjuntos de datos con muchas columnas.
En el análisis de datos, a veces solo necesitamos prestar atención a columnas específicas, como seleccionar solo columnas numéricas, solo columnas que comienzan con un prefijo específico, o solo columnas que contienen una palabra clave específica.filter()Está diseñada precisamente para estos escenarios.
Sintaxis básica y parámetros
filter()Es un método de DataFrame y Series (para Series, solo se admite el parámetro items), utilizado para filtrar columnas según condiciones.
Formato de sintaxis
DataFrame.filter(items=None, like=None, regex=None, axis=None)
Descripción de parámetros
| Parámetro | Tipo | ¿Requerido? | Descripción | Valor predeterminado |
|---|---|---|---|---|
| items | list | Opcional | Especifica directamente una lista de nombres de columna y selecciona las columnas que coinciden. | None |
| like | str | Opcional | Nombres de columna que contienen la cadena especificada; admite coincidencia difusa. | None |
| regex | str | Opcional | Patrón de expresión regular para hacer coincidir nombres de columna. | None |
| axis | int o str | Opcional | Eje del filtrado. 0 o 'index' indica filas, 1 o 'columns' indica columnas. | 1 o 'columns' |
Descripción del valor de retorno
- Tipo de valor de retorno: Devuelve un nuevo DataFrame que contiene las columnas filtradas.
- Filtrado de columnas: de forma predeterminada,
filter()actúa sobre las columnas (axis=1). - Conserva todas las filas: el filtrado solo afecta a las columnas; los datos de las filas permanecen sin cambios.
Ejemplos
A través de abundantes ejemplos, dominemos completamentefilter()el uso de.
Ejemplo 1: Uso básico - Usando el parámetro items
Especifica directamente una lista de nombres de columna para seleccionar columnas específicas.
Ejemplo
# Crear un DataFrame de ejemplo
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [18, 19, 17, 18, 20],
'score': [85, 92, 78, 90, 88],
'grade': ['A', 'A', 'B', 'A', 'B'],
'city': ['Beijing', 'Shanghai', 'Beijing', 'Guangzhou', 'Shanghai']
}
df = pd.DataFrame(data)
print("DataFrame original:")
print(df)
print()
# Usar el parámetro items para seleccionar columnas específicas
print("Seleccionar las columnas name y age:")
print(df.filter(items=['name', 'age']))
print()
# Seleccionar una sola columna (devuelve DataFrame)
print("Seleccionar solo la columna score:")
print(df.filter(items=['score']))
Resultado de la ejecución:
原始 DataFrame:
name age score grade city
0 Alice 18 85 A Beijing
1 Bob 19 92 A Shanghai
2 Charlie 17 78 B Beijing
3 David 18 90 A Guangzhou
4 Eve 20 88 B Shanghai
选择 name 和 age 列:
name age
0 Alice 18
1 Bob 19
2 Charlie 17
3 David 18
4 Eve 20
只选择 score 列:
score
0 85
1 92
2 78
3 90
4 88
Análisis del código:
filter(items=['name', 'age'])Selecciona las columnas especificadas y devuelve un nuevo DataFrame que contiene estas columnas.- Todas las filas se conservan; solo se seleccionan columnas específicas.
- Si el nombre de columna especificado no existe, se lanza un KeyError.
Ejemplo 2: Usando el parámetro like - Coincidencia difusa
likeEl parámetro like nos permite filtrar columnas cuyo nombre contiene la cadena especificada; esto es muy adecuado para conjuntos de datos con nombres de columna regulares.
Ejemplo
# Crear un DataFrame cuyos nombres de columna siguen un patrón
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age_2020': [18, 19, 17, 18, 20],
'age_2021': [19, 20, 18, 19, 21],
'age_2022': [20, 21, 19, 20, 22],
'score_2020': [85, 92, 78, 90, 88],
'score_2021': [87, 94, 80, 92, 90],
'score_2022': [89, 96, 82, 94, 92],
'city': ['Beijing', 'Shanghai', 'Beijing', 'Guangzhou', 'Shanghai']
}
df = pd.DataFrame(data)
print("DataFrame original:")
print(df)
print()
# Seleccionar todas las columnas que contienen "age"
print("Columnas que contienen 'age':")
print(df.filter(like='age'))
print()
# Seleccionar todas las columnas que contienen "score"
print("Columnas que contienen 'score':")
print(df.filter(like='score'))
print()
# Seleccionar todas las columnas que contienen "2021"
print("Columnas que contienen '2021':")
print(df.filter(like='2021'))
Resultado de la ejecución:
原始 DataFrame:
name age_2020 age_2021 age_2022 score_2020 score_2021 score_2022 city
0 Alice 18 19 20 85 87 89 Beijing
1 Bob 19 20 21 92 94 96 Shanghai
2 Charlie 17 18 19 78 80 82 Beijing
3 David 18 19 20 90 92 94 Guangzhou
4 Eve 20 21 22 88 90 92 Shanghai
包含 'age' 的列:
age_2020 age_2021 age_2022
0 18 19 20
1 19 20 21
2 17 18 19
3 18 19 20
4 20 21 22
包含 'score' 的列:
score_2020 score_2021 score_2022
0 85 87 89
1 92 94 96
2 78 80 82
3 90 92 94
4 88 90 92
包含 '2021' 的列:
age_2021 score_2021
0 19 87
1 20 94
2 18 80
3 19 92
4 21 90
Análisis del código:
filter(like='age')Selecciona todas las columnas cuyo nombre contiene "age".- La coincidencia difusa no requiere conocer el nombre completo de la columna; solo se necesita proporcionar una cadena de coincidencia parcial.
- Esto es especialmente útil al manejar columnas con convenciones de nomenclatura similares (como columnas organizadas por año).
Ejemplo 3: Usando el parámetro regex - Coincidencia con expresión regular
Para necesidades de filtrado de nombres de columna más complejas, se pueden usar expresiones regulares.
Ejemplo
# Crear nombres de columna complejos
data = {
'id': [1, 2, 3, 4, 5],
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age_2020': [18, 19, 17, 18, 20],
'age_2021': [19, 20, 18, 19, 21],
'score_math': [85, 92, 78, 90, 88],
'score_english': [87, 94, 80, 92, 90],
'score_science': [89, 96, 82, 94, 92],
'city': ['Beijing', 'Shanghai', 'Beijing', 'Guangzhou', 'Shanghai']
}
df = pd.DataFrame(data)
print("Columnas del DataFrame original:")
print(df.columns.tolist())
print()
# Seleccionar columnas que comiencen con "score_"
print("Columnas que comienzan con 'score_':")
print(df.filter(regex='^score_'))
print()
# Seleccionar nombres de columna que contengan números
print("Nombres de columna que contienen números:")
print(df.filter(regex='\d')) # d coincide con dígitos
print()
# Seleccionar columnas que contengan tanto "age" como "202"
print("Columnas que contienen 'age' y '202':")
print(df.filter(regex='age.*202|202.*age'))
print()
# Seleccionar columnas que comiencen con letra y no contengan guiones bajos
print("Columnas que comienzan con letra y no contienen guiones bajos:")
print(df.filter(regex='^[a-zA-Z]+$'))
Resultado de la ejecución:
原始 DataFrame 的列:
['id', 'name', 'age_2020', 'age_2021', 'score_math', 'score_english', 'score_science', 'city']
以 'score_' 开头的列:
score_math score_english score_science
0 85 87 89
1 92 94 96
2 78 80 82
3 90 92 94
4 88 90 92
包含数字的列名:
age_2020 age_2021 score_math score_english score_science
0 18 19 85 87 89
1 19 20 92 94 96
2 17 18 78 80 82
3 18 19 90 92 94
4 20 21 88 90 92
包含 'age' 和 '202' 的列:
age_2020 age_2021
0 18 19
1 19 20
2 17 18
3 18 19
4 20 21
以字母开头且不含下划线的列:
name city
0 Alice Beijing
1 Bob Shanghai
2 Charlie Beijing
3 David Guangzhou
4 Eve Shanghai
Análisis del código:
filter(regex='^score_')Usa^para hacer coincidir las columnas que comienzan con "score_".filter(regex='\d')Usa\dpara hacer coincidir los nombres de columna que contienen números.- Las expresiones regulares ofrecen la máxima flexibilidad y pueden manejar diversas necesidades de coincidencia complejas.
Ejemplo 4: Filtrar filas usando el parámetro axis
Aunquefilter()se utiliza principalmente para columnas, medianteaxisel parámetro también se puede utilizar para filtrar filas.
Ejemplo
# Crear un DataFrame con índice con nombre
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [18, 19, 17, 18, 20],
'score': [85, 92, 78, 90, 88]
}
df = pd.DataFrame(data, index=['row1', 'row2', 'row3', 'row4', 'row5'])
print("DataFrame con índice con nombre:")
print(df)
print()
# Filtrar filas usando axis='index' (con like)
print("Filas cuyo índice contiene 'row':")
print(df.filter(like='row', axis='index'))
print()
# Filtrar filas de índices específicos usando items
print("Filas con índice 'row1' y 'row3':")
print(df.filter(items=['row1', 'row3'], axis='index'))
print()
# Filtrar filas usando regex
print("Filas cuyo índice coincide con la expresión regular (row)
print(df.filter(regex='row[135]', axis='index'))
Resultado de la ejecución:
带命名索引的 DataFrame:
name age score
row1 Alice 18 85
row2 Bob 19 92
row3 Charlie 17 78
row4 David 18 90
row5 Eve 20 88
索引包含 'row' 的行:
name age score
row1 Alice 18 85
row2 Bob 19 92
row3 Charlie 17 78
row4 David 18 90
row5 Eve 20 88
索引为 'row1' 和 'row3' 的行:
name age score
row1 Alice 18 85
row3 Charlie 17 78
索引匹配正则表达式(row[135])的行:
name age score
row1 Alice 18 85
row3 Charlie 17 78
row5 Eve 20 88
Análisis del código:
axis='index'oaxis=0Le indica afilter()que filtre por el índice de filas.like、items、regexEl uso del parámetro en el filtrado de filas es el mismo que en el filtrado de columnas.- Esto es muy útil cuando se necesita filtrar filas específicas según el nombre del índice.
Ejemplo 5: Combinación con otras funciones
filter()Se puede combinar con otras funciones de Pandas para lograr potentes capacidades de selección de datos.
Ejemplo
import numpy as np
# Crear un DataFrame grande
np.random.seed(42)
df = pd.DataFrame(np.random.randn(5, 10), columns=[
'A', 'B', 'C', 'D', 'E',
'AA', 'BB', 'CC', 'DD', 'EE'
])
print("Columnas del DataFrame original:")
print(df.columns.tolist())
print()
# Filtrar columnas de una sola letra y calcular
single_letter_cols = df.filter(regex='^[A-E]$')
print("Media de las columnas de una sola letra (A-E):")
print(single_letter_cols.mean())
print()
# Filtrar columnas de doble letra y calcular
double_letter_cols = df.filter(regex='^[A-E]{2}$')
print("Media de las columnas de doble letra (AA-EE):")
print(double_letter_cols.mean())
print()
# Primero filtrar columnas, luego seleccionar filas
print("Primeras 3 filas de las columnas de doble letra:")
print(df.filter(regex='^[A-E]{2}$').head(3))
Resultado de la ejecución:
原始 DataFrame 的列:
['A', 'B', 'C', 'D', 'E', 'AA', 'BB', 'CC', 'DD', 'EE']
单字母列(A-E)的均值:
A 0.336744
B 0.128223
C -0.234007
D -0.347540
E -0.197939
dtype: float64
双字母列(AA-EE)的均值:
AA 0.530256
BB -0.671336
CC 0.506853
DD -0.443588
EE -0.456486
dtype: float64
双字母列的前 3 行:
AA BB CC DD EE
0 -0.013497 -1.174139 0.214864 1.550698 0.375698
1 -1.368593 0.746580 0.669383 -0.717552 -1.159950
2 0.602619 -1.700736 -0.201647 -0.605166 -0.012750
Análisis del código:
filter()Se puede encadenar con otros métodos de DataFrame.- Primero se filtran columnas específicas y luego se realizan cálculos estadísticos, mejorando la legibilidad del código.
- Esto es especialmente útil al trabajar con tablas anchas.
Consideraciones
itemsSe usa para especificar con precisión los nombres de columna,likeSe usa para coincidencia difusa,regexSe usa para coincidencia con expresiones regulares. Elija el método adecuado según sus necesidades.- Al trabajar con conjuntos de datos grandes, primero se utiliza
filter()para filtrar las columnas necesarias, lo que puede reducir la cantidad de datos para cálculos posteriores y mejorar el rendimiento. filter()Por defecto actúa sobre las columnas (axis=1); se puedeaxis='index'oaxis=0cambiar la dirección del filtrado.- Nota:
items、like、regexEstos tres parámetros son mutuamente excluyentes y no se pueden usar al mismo tiempo.
Consejo:
filter()Es una herramienta poderosa para manejar tablas anchas (conjuntos de datos con muchas columnas). Especialmente en la fase de exploración de datos, si solo se desea prestar atención a un tipo de información (como todas las columnas numéricas o todas las que comienzan con cierto prefijo), usándolafilter()se puede completar rápidamente el filtrado de columnas.
Resumen
filter()Es una función en Pandas específicamente diseñada para filtrar columnas (y filas). Proporciona tres métodos de filtrado: especificación exacta (items), coincidencia difusa (like) y coincidencia mediante expresiones regulares (regex).
Los principales escenarios de aplicación de esta función incluyen: filtrar columnas específicas, manejar columnas con convenciones de nomenclatura regulares y seleccionar dinámicamente las columnas que necesitan análisis. Combinada con otras funciones de Pandas, puede mejorar significativamente la eficiencia del procesamiento de datos y la legibilidad del código.
Otras extensiones
Funciones comunes de Pandas