Dans pandas, utilisez la méthode 𝐟𝐢𝐥𝐭𝐞𝐫() pour sélectionner des lignes ou des colonnes dans D𝐚𝐭𝐚F𝐫𝐚𝐦𝐞 en fonction de leurs étiquettes (noms). Cette méthode est fournie pour D𝐚𝐭𝐚F𝐫𝐚𝐦𝐞 et S𝐞𝐫𝐢𝐞𝐬 .
- pandas.DataFrame.filter — documentation de pandas 2.1.4
- pandas.Series.filter — documentation de pandas 2.1.4
Pour extraire des lignes qui répondent à des conditions basées sur des valeurs plutôt que sur des étiquettes de ligne, reportez-vous aux articles suivants.
- pandas : interroger le DataFrame et extraire des lignes avec query()
- pandas : sélectionner des lignes selon plusieurs conditions
- pandas : extraire des lignes contenant des chaînes spécifiques d’un DataFrame
Vous pouvez également sélectionner des colonnes en fonction des types de données.
La version pandas utilisée dans cet article est la suivante. Notez que les fonctionnalités peuvent varier selon les versions. Le D𝐚𝐭𝐚F𝐫𝐚𝐦𝐞 suivant est utilisé comme exemple.
import pandas as pd print(pd.__version__) # 2.1.4 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
Utilisation de base de 𝐩𝐚𝐧𝐝𝐚𝐬.D𝐚𝐭𝐚F𝐫 𝐚𝐦𝐞.𝐟𝐢𝐥𝐭𝐞𝐫()
La méthode 𝐟𝐢𝐥𝐭𝐞𝐫() d’un D𝐚𝐭𝐚F𝐫𝐚𝐦𝐞 peut être utilisée pour extraire des lignes ou des colonnes en fonction de leurs étiquettes ( 𝐢𝐧𝐝𝐞𝐱 et 𝐜𝐨𝐥𝐮𝐦𝐧𝐬 ).
Spécifiez la condition en utilisant 𝐢𝐭𝐞𝐦𝐬 , 𝐥𝐢𝐤𝐞 ou 𝐫𝐞𝐠𝐞𝐱 comme argument. Les implémentés entraînent simultanément une erreur. Les détails sur chacun d’eux sont abordés plus loin.
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 répond à la condition, une valeur vide D𝐚𝐭𝐚F𝐫𝐚𝐦𝐞 est renvoyée. Cela n’entraîne pas d’erreur.
print(df.filter(items=['X'])) # Empty DataFrame # Columns: [] # Index: [apple, banana, pineapple]
L’axe sur lequel filtrer : 𝐚𝐱𝐢𝐬
Vous pouvez préciser l’axe sur lequel avec filtrer l’argument 𝐚𝐱𝐢𝐬 . Utilisez 0 ou ‘𝐢𝐧𝐝𝐞𝐱’ pour les lignes et 1 ou ‘𝐜𝐨𝐥𝐮𝐦𝐧𝐬’ pour les 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 elles sont omises, les colonnes sont filtrées par défaut.
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. Pour filtrer les deux, répétez la commande 𝐟𝐢𝐥𝐭𝐞𝐫() .
print(df.filter(items=['A', 'C']).filter(items=['apple', 'pineapple'], axis=0)) # A C # apple 0 2 # pineapple 6 8
Filtrer par correspondance exacte : 𝐢𝐭𝐞𝐦𝐬
Pour extraire des lignes ou des colonnes avec des étiquettes exactement identiques, précisez une liste dans l’argument 𝐢𝐭𝐞𝐦𝐬 . L’ordre des lignes ou des colonnes dans le résultat correspond à l’ordre dans la liste précise, et non à l’ordre d’origine.
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 la même chose en spécifiant une liste d’étiquettes avec [] ou 𝐥𝐨𝐜[] .
- pandas : Sélectionner des lignes/colonnes par index (numéros et noms)
- pandas : obtenir/définir des valeurs avec loc, iloc, at, iat
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
Filtrer par correspondance partielle : 𝐥𝐢𝐤𝐞
Pour extraire des lignes ou des colonnes avec des étiquettes partiellement correspondantes, spécifiez une chaîne dans l’argument 𝐥𝐢𝐤𝐞 .
print(df.filter(like='apple', axis=0)) # A B C # apple 0 1 2 # pineapple 6 7 8
Les lignes ou colonnes dont les étiquettes contiennent la chaîne spécifiée dans 𝐥𝐢𝐤𝐞 (comme dans 𝐥𝐢𝐤𝐞 𝐢𝐧 𝐥𝐚𝐛𝐞𝐥 == T𝐫𝐮𝐞 ) sont extraites. Pour en savoir plus sur l’opérateur 𝐢𝐧 , consultez l’article suivant.
Pour spécifiquement plusieurs conditions, utilisez des expressions régulières (regex) comme décrites ci-après.
Filtrer par expression régulière : 𝐫𝐞𝐠𝐞𝐱
Pour extraire des lignes ou des colonnes en fonction de l’expression régulière de leurs étiquettes, utilisez un modèle d’expression régulière spécifié dans l’argument 𝐫𝐞𝐠𝐞𝐱 .
Consultez la documentation officielle pour les caractères spéciaux dans regex.
Extraire les lignes dont les étiquettes se terminent par « 𝐞 » :
print(df.filter(regex='e$', axis=0)) # A B C # apple 0 1 2 # pineapple 6 7 8
Extraire les lignes dont les étiquettes commencent par « 𝐚 » ou « 𝐛 » .
print(df.filter(regex='^(a|b)', axis=0)) # A B C # apple 0 1 2 # banana 3 4 5
Extraire les lignes dont les étiquettes contiennent « 𝐧𝐚 » ou « 𝐧𝐞 » :
print(df.filter(regex='(na|ne)', axis=0)) # A B C # banana 3 4 5 # pineapple 6 7 8
Les lignes ou les colonnes dont les étiquettes correspondent au modèle d’expression régulière (comme dans 𝐫𝐞.𝐬𝐞𝐚𝐫𝐜𝐡(𝐫𝐞𝐠𝐞𝐱, 𝐥𝐚𝐛𝐞𝐥) == T𝐫𝐮𝐞 ) sont extraites. Pour plus d’informations sur 𝐫𝐞.𝐬𝐞𝐚𝐫𝐜𝐡() , reportez-vous à l’article suivant.
𝐩𝐚𝐧𝐝𝐚𝐬.S𝐞𝐫𝐢𝐞𝐬.𝐟𝐢𝐥𝐭𝐞𝐫()
La méthode 𝐟𝐢𝐥𝐭𝐞𝐫() est également fournie pour S𝐞𝐫𝐢𝐞𝐬 . L’utilisation est la même qu’avec D𝐚𝐭𝐚F𝐫𝐚𝐦𝐞 .
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
