Skip to content

pandas : Extraction des lignes/colonnes d’un DataFrame en fonction des étiquettes

Vous pouvez extraire des lignes et des colonnes de pandas.DataFrame en fonction des noms de lignes et de colonnes (étiquettes d’index et de colonnes) avec la méthode filter().

Cet article décrit le contenu suivant.

  • Comment utiliser pandas.DataFrame.filter()
    • L’axe sur lequel filtrer :axis
  • Correspondance exacte:items
  • Correspondance partielle :like
  • Expression régulière:regex
  • Pour les pandas.Série

Consultez l’article suivant pour les bases de la sélection de lignes et de colonnes dans les pandas.

Utilisez les pandas.DataFrame suivants.

import pandas as pd

print(pd.__version__)
# 1.2.2

df = pd.DataFrame([[0, 1, 2], [3, 4, 5], [6, 7, 8]],
                  index=['apple', 'banana', 'pineapple'],
                  columns=['A', 'B', 'C'])
print(df)
#            A  B  C
# apple      0  1  2
# banana     3  4  5
# pineapple  6  7  8

Comment utiliser pandas.DataFrame.filter()

La méthode filter() de pandas.DataFrame renvoie un sous-ensemble en fonction des noms de ligne et de colonne.

Vous pouvez spécifier des conditions avec les paramètres items, like et regex. Si ces paramètres sont spécifiés simultanément, une erreur est levée. Les détails de chacun sont décrits ci-dessous.

print(df.filter(items=['A', 'C']))
#            A  C
# apple      0  2
# banana     3  5
# pineapple  6  8

# print(df.filter(items=['A', 'C'], like="A"))
# TypeError: Keyword arguments `items`, `like`, or `regex` are mutually exclusive

Si aucune ligne ou colonne ne satisfait la condition, un pandas.DataFrame vide est renvoyé.

print(df.filter(items=['X']))
# Empty DataFrame
# Columns: []
# Index: [apple, banana, pineapple]

L’axe sur lequel filtrer :axis

Vous pouvez spécifier l’axe sur lequel filtrer avec le paramètre d’axe. Les lignes sont filtrées pour 0 ou ‘index’, les colonnes pour 1 ou colonnes.

print(df.filter(items=['apple', 'pineapple'], axis=0))
#            A  B  C
# apple      0  1  2
# pineapple  6  7  8

print(df.filter(items=['apple', 'pineapple'], axis='index'))
#            A  B  C
# apple      0  1  2
# pineapple  6  7  8

print(df.filter(items=['A', 'C'], axis=1))
#            A  C
# apple      0  2
# banana     3  5
# pineapple  6  8

print(df.filter(items=['A', 'C'], axis='columns'))
#            A  C
# apple      0  2
# banana     3  5
# pineapple  6  8

Si omis, les colonnes sont filtrées.

print(df.filter(items=['A', 'C']))
#            A  C
# apple      0  2
# banana     3  5
# pineapple  6  8

Il n’est pas possible de filtrer simultanément les lignes et les colonnes. Si vous souhaitez filtrer à la fois les lignes et les colonnes, répétez filter().

print(df.filter(items=['A', 'C']).filter(items=['apple', 'pineapple'], axis=0))
#            A  C
# apple      0  2
# pineapple  6  8

Correspondance exacte:items

Vous pouvez extraire des lignes/colonnes dont les noms (étiquettes) correspondent exactement en spécifiant une liste pour le paramètre items. L’ordre des lignes et des colonnes du résultat est l’ordre de la liste spécifiée.

print(df.filter(items=['A', 'C']))
#            A  C
# apple      0  2
# banana     3  5
# pineapple  6  8

print(df.filter(items=['C', 'A']))
#            C  A
# apple      2  0
# banana     5  3
# pineapple  8  6

Vous pouvez faire de même en spécifiant une liste d’étiquettes avec [] ou loc[].

print(df[['C', 'A']])
#            C  A
# apple      2  0
# banana     5  3
# pineapple  8  6

print(df.loc[:, ['C', 'A']])
#            C  A
# apple      2  0
# banana     5  3
# pineapple  8  6

print(df.loc[['pineapple', 'apple']])
#            A  B  C
# pineapple  6  7  8
# apple      0  1  2

Correspondance partielle :like

Vous pouvez extraire des lignes/colonnes dont les noms (étiquettes) correspondent partiellement en spécifiant une chaîne pour le paramètre like.

print(df.filter(like='apple', axis=0))
#            A  B  C
# apple      0  1  2
# pineapple  6  7  8

Les lignes et les colonnes avec comme dans l’étiquette == True sont extraites.

Pour spécifier plusieurs conditions, utilisez l’expression régulière décrite ci-dessous.

Expression régulière:regex

Vous pouvez extraire des lignes/colonnes en sélectionnant leurs noms (étiquettes) avec des expressions régulières en spécifiant le modèle d’expression régulière pour le paramètre regex.

Voir la documentation officielle pour les caractères spéciaux dans les expressions régulières.

Extraire les lignes dont les noms se terminent par ‘e’.

print(df.filter(regex='e$', axis=0))
#            A  B  C
# apple      0  1  2
# pineapple  6  7  8

Extraire les lignes dont les noms commencent par ‘a’ ou ‘b’.

print(df.filter(regex='^(a|b)', axis=0))
#         A  B  C
# apple   0  1  2
# banana  3  4  5

Extraire les lignes dont les noms contiennent ‘na’ ou ‘ne’.

print(df.filter(regex='(na|ne)', axis=0))
#            A  B  C
# banana     3  4  5
# pineapple  6  7  8

Pour les pandas.Série

La série a également une méthode filter(). Son utilisation est la même que pandas.DataFrame.

s = pd.Series([0, 1, 2], index=['apple', 'banana', 'pineapple'])
print(s)
# apple        0
# banana       1
# pineapple    2
# dtype: int64

print(s.filter(items=['pineapple', 'banana']))
# pineapple    2
# banana       1
# dtype: int64

print(s.filter(like='apple'))
# apple        0
# pineapple    2
# dtype: int64

print(s.filter(regex='^(a|b)'))
# apple     0
# banana    1
# dtype: int64