Fonction Pandas df.filter()

Fonctions courantes de Pandas


filter()est une fonction de Pandas utilisée pour filtrer les colonnes (plutôt que les lignes). Elle peut sélectionner des colonnes spécifiques en fonction des noms de colonnes, des motifs d'étiquettes ou des expressions régulières. Différente desloc[]etiloc[]autres fonctions,filter()elle est spécifiquement conçue pour la sélection de colonnes, ce qui est très utile lorsqu'on manipule des ensembles de données comportant de nombreuses colonnes.

Dans l'analyse de données, nous devons parfois nous concentrer uniquement sur des colonnes spécifiques, par exemple en sélectionnant uniquement les colonnes numériques, uniquement les colonnes commençant par un préfixe spécifique, ou uniquement les colonnes contenant un mot-clé spécifique.filter()Elle est conçue pour ces scénarios.


Syntaxe de base et paramètres

filter()est une méthode de DataFrame et Series (pour Series, seul le paramètre items est pris en charge), utilisée pour filtrer les colonnes en fonction de conditions.

Format de syntaxe

DataFrame.filter(items=None, like=None, regex=None, axis=None)

Description des paramètres

Paramètre Type Requis Description Valeur par défaut
items liste Optional Spécifier directement une liste de noms de colonnes pour sélectionner les colonnes correspondantes. Aucune
comme str Optional Noms de colonnes contenant la chaîne spécifiée ; prend en charge la correspondance floue. Aucune
regex str Optional Motif d'expression régulière pour correspondre aux noms de colonnes. Aucune
axis int ou str Optional L'axe à filtrer. 0 ou 'index' désigne les lignes, 1 ou 'columns' désigne les colonnes. 1 ou 'columns'

Description de la valeur de retour

  • Type de retour: Renvoie un nouveau DataFrame contenant les colonnes filtrées.
  • Filtrage des colonnes: Par défaut,filter()il agit sur les colonnes (axis=1).
  • Toutes les lignes sont conservées: Le filtrage n'affecte que les colonnes ; les données des lignes restent inchangées.

Exemples

Maîtrisons pleinement l'utilisation defilter()celui-ci à travers de riches exemples.

Exemple 1 : Utilisation de base - utilisation du paramètre items

Spécifiez directement une liste de noms de colonnes pour sélectionner des colonnes spécifiques.

Exemple

import pandas as pd

# Créer un DataFrame d'exemple
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 d'origine :")
print(df)
print()

# Utilisez le paramètre items pour sélectionner des colonnes spécifiques
print("Sélectionnez les colonnes name et age :")
print(df.filter(items=['name', 'age']))
print()

# Sélectionner une seule colonne (renvoie un DataFrame)
print("Sélectionnez uniquement la colonne score :")
print(df.filter(items=['score']))

Sortie :

原始 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

Explication du code :

  1. filter(items=['name', 'age'])Sélectionne les colonnes spécifiées et renvoie un nouveau DataFrame contenant ces colonnes.
  2. Toutes les lignes sont conservées ; seules des colonnes spécifiques sont sélectionnées.
  3. Si un nom de colonne spécifié n'existe pas, une KeyError est levée.

Exemple 2 : Utilisation du paramètre like - correspondance floue

likeLe paramètre `like` nous permet de filtrer les colonnes dont les noms contiennent une chaîne spécifiée. Cela convient très bien aux jeux de données dont les noms de colonnes sont réguliers.

Exemple

import pandas as pd

# Créer un DataFrame avec des noms de colonnes réguliers
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 d'origine :")
print(df)
print()

# Sélectionner toutes les colonnes contenant "age"
print("Colonnes contenant 'age' :")
print(df.filter(like='age'))
print()

# Sélectionner toutes les colonnes contenant "score"
print("Colonnes contenant 'score' :")
print(df.filter(like='score'))
print()

# Sélectionner toutes les colonnes contenant "2021"
print("Colonnes contenant '2021' :")
print(df.filter(like='2021'))

Sortie :

原始 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

Explication du code :

  • filter(like='age')Sélectionne toutes les colonnes dont les noms contiennent "age".
  • La correspondance floue ne nécessite pas de connaître le nom complet de la colonne ; il suffit de fournir une chaîne de correspondance partielle.
  • C'est particulièrement utile lorsqu'on traite des colonnes qui suivent des conventions de nommage similaires (par exemple, des colonnes organisées par année).

Exemple 3 : Utilisation du paramètre regex - correspondance d'expressions régulières

Pour des besoins de filtrage de noms de colonnes plus complexes, des expressions régulières peuvent être utilisées.

Exemple

import pandas as pd

# Créer des noms de colonnes complexes
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("Colonnes du DataFrame d'origine :")
print(df.columns.tolist())
print()

# Sélectionner les colonnes commençant par "score_"
print("Colonnes commençant par 'score_' :")
print(df.filter(regex='^score_'))
print()

# Sélectionner les noms de colonnes contenant des chiffres
print("Noms de colonnes contenant des chiffres :")
print(df.filter(regex='\d'))  # \d correspond à des chiffres
print()

# Sélectionner les colonnes contenant à la fois "age" et "202"
print("Colonnes contenant à la fois 'age' et '202' :")
print(df.filter(regex='age.*202|202.*age'))
print()

# Sélectionner les colonnes commençant par une lettre et ne contenant pas de tirets bas
print("Colonnes commençant par une lettre et sans tirets bas :")
print(df.filter(regex='^[a-zA-Z]+$'))

Sortie :

原始 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

Explication du code :

  1. filter(regex='^score_')Utiliser^pour faire correspondre les colonnes commençant par "score_".
  2. filter(regex='\d')Utiliser\dpour faire correspondre les noms de colonnes contenant des chiffres.
  3. Les expressions régulières offrent la plus grande flexibilité et peuvent gérer divers besoins de correspondance complexes.

Exemple 4 : Utilisation du paramètre axis pour filtrer les lignes

Bien quefilter()il est principalement utilisé pour les colonnes, via leaxisparamètre, il peut aussi être utilisé pour filtrer les lignes.

Exemple

import pandas as pd

# Créer un DataFrame avec un index nommé
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 avec index nommé :")
print(df)
print()

# Utiliser axis='index' pour filtrer les lignes (en utilisant like)
print("Lignes dont l'index contient 'row' :")
print(df.filter(like='row', axis='index'))
print()

# Utiliser items pour filtrer les lignes avec des indices spécifiques
print("Lignes avec l'index 'row1' et 'row3' :")
print(df.filter(items=['row1', 'row3'], axis='index'))
print()

# Utiliser une regex pour filtrer les lignes
print("Lignes dont l'index correspond à la regex (ligne)
print(df.filter(regex='row[135]', axis='index'))

Sortie :

带命名索引的 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

Explication du code :

  • axis='index'ouaxis=0Indiquefilter()df.filter() pour filtrer les indices de lignes.
  • like、items、regexLes paramètres ont le même usage dans le filtrage des lignes que dans le filtrage des colonnes.
  • Ceci est très utile lorsque vous devez filtrer des lignes spécifiques en fonction des noms d'index.

Exemple 5 : Combinaison avec d'autres fonctions

filter()Il peut être combiné avec d'autres fonctions Pandas pour obtenir de puissantes capacités de sélection de données.

Exemple

import pandas as pd
import numpy as np

# Créer un grand DataFrame
np.random.seed(42)
df = pd.DataFrame(np.random.randn(5, 10), columns=[
    'A', 'B', 'C', 'D', 'E',
    'AA', 'BB', 'CC', 'DD', 'EE'
])

print("Colonnes du DataFrame d'origine :")
print(df.columns.tolist())
print()

# Filtrer les colonnes à une seule lettre et effectuer un calcul
single_letter_cols = df.filter(regex='^[A-E]$')
print("Moyenne des colonnes à une seule lettre (A-E) :")
print(single_letter_cols.mean())
print()

# Filtrer les colonnes à deux lettres et effectuer un calcul
double_letter_cols = df.filter(regex='^[A-E]{2}$')
print("Moyenne des colonnes à deux lettres (AA-EE) :")
print(double_letter_cols.mean())
print()

# Filtrer d'abord les colonnes, puis sélectionner les lignes
print("3 premières lignes des colonnes à deux lettres :")
print(df.filter(regex='^[A-E]{2}$').head(3))

Sortie :

原始 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

Explication du code :

  • filter()Il peut être enchaîné avec d'autres méthodes DataFrame.
  • Filtrez d'abord des colonnes spécifiques, puis effectuez des calculs statistiques, ce qui améliore la lisibilité du code.
  • Ceci est particulièrement utile lors du traitement de tables larges.

Notes

  • items`items` est utilisé pour spécifier précisément les noms de colonnes, `like` est utilisé pour la correspondance floue, et `regex` est utilisé pour la correspondance par expression régulière. Choisissez la méthode appropriée selon les besoins réels.likeLors du traitement de grands ensembles de données, utilisez d'abordregexpour filtrer les colonnes nécessaires, ce qui peut réduire la quantité de données pour les calculs ultérieurs et améliorer les performances.
  • Par défaut, il agit sur les colonnes (axis=1), et peut être utilisé pourfilter()changer la direction du filtrage.
  • filter()Remarqueaxis='index'ouaxis=0Ces trois paramètres sont mutuellement exclusifs et ne peuvent pas être utilisés simultanément.
  • Astuce :items、like、regexC'est un outil puissant pour traiter des tables larges (ensembles de données avec de nombreuses colonnes). En particulier lors de la phase d'exploration des données, si vous souhaitez vous concentrer uniquement sur un certain type d'informations (comme toutes les colonnes numériques, toutes les colonnes commençant par un certain préfixe), l'utilisation de

celui-ci peut rapidement effectuer le filtrage des colonnes.filter()Résuméfilter()Les colonnes peuvent être rapidement filtrées.


Résumé

filter()Il s'agit d'une fonction de Pandas spécifiquement utilisée pour filtrer des colonnes (et des lignes). Elle propose trois méthodes de filtrage : la spécification exacte (items), la correspondance floue (like) et la correspondance par expression régulière (regex).

Les principaux scénarios d'application de cette fonction incluent : filtrer des colonnes spécifiques, gérer des colonnes dont les noms suivent une convention régulière et sélectionner dynamiquement des colonnes pour l'analyse. Lorsqu'elle est utilisée en combinaison avec d'autres fonctions Pandas, elle peut considérablement améliorer l'efficacité du traitement des données et la lisibilité du code.

Fonctions courantes de Pandas

Autres extensions