Función Pandas df.filter()

Pandas 常用函数Funciones comunes de Pandas


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

import pandas as pd

# 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:

  1. filter(items=['name', 'age'])Selecciona las columnas especificadas y devuelve un nuevo DataFrame que contiene estas columnas.
  2. Todas las filas se conservan; solo se seleccionan columnas específicas.
  3. 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

import pandas as pd

# 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

import pandas as pd

# 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:

  1. filter(regex='^score_')Usa^para hacer coincidir las columnas que comienzan con "score_".
  2. filter(regex='\d')Usa\dpara hacer coincidir los nombres de columna que contienen números.
  3. 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

import pandas as pd

# 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 pandas as pd
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 utilizafilter()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.

Pandas 常用函数Funciones comunes de Pandas

Otras extensiones