Filtrage et requête conditionnelle avec Pandas
Le filtrage de données est l'une des opérations les plus courantes dans l'analyse de données. Pandas offre de riches fonctionnalités de requête conditionnelle qui vous permettent de filtrer les données en fonction de diverses conditions. Cette section présente en détail diverses méthodes de filtrage de données.
Filtrage conditionnel de base
Filtrage par condition unique
Exemple
# Créer des données d'exemple
df = pd.DataFrame({
"Nom": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu", "Qian Qi"],
"Âge": [25, 30, 28, 35, 22],
"Ville": ["Beijing", "Shanghai", "Guangzhou", "Beijing", "Shenzhen"],
"Salaire": [12000, 15000, 11000, 18000, 9000],
"Department": ["Tech", "Sales", "Tech", "Operations", "Tech"]
})
print(Données brutes :)
print(df)
print()
# Filtrage par égalité
print("City est égal à Beijing :")
print(df[df["City"] == "Beijing"])
print()
# Filtrage par inégalité
print("Ville différente de Beijing:")
print(df[df["City"] != "Beijing"])
print()
# Supérieur à et inférieur à
print("Salaire supérieur à 12000:")
print(df[df["Salary"] > 12000])
print()
# Condition de chaîne
print("Le nom contient 'San':")
print(df[df["Name"].str.contains("San")])
Combiner plusieurs conditions
Exemple
df = pd.DataFrame({
"Nom": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu", "Qian Qi"],
"Âge": [25, 30, 28, 35, 22],
"Ville": ["Beijing", "Shanghai", "Guangzhou", "Beijing", "Shenzhen"],
"Salaire": [12000, 15000, 11000, 18000, 9000],
"Department": ["Tech", "Sales", "Tech", "Operations", "Tech"]
})
# Condition ET: utiliser l'opérateur &
print("Beijing et Salary>10000:")
print(df[(df["City"] == "Beijing") & (df["Salary"] > 10000)])
print()
# Condition OU : utiliser l'opérateur |
print("Département Tech ou Salary>15000 :")
print(df[(df["Department"] == "Tech") | (df["Salary"] > 15000)])
print()
# Condition NON : utiliser l'opérateur ~
print("Département non Tech :")
print(df[~(df["Department"] == "Tech")])
print()
# Combinaison complexe
print("(Beijing et Age>25) ou (Shanghai) :")
print(df[((df["City"] == "Beijing") & (df["Age"] > 25)) | (df["City"] == "Shanghai")])
Lorsque vous combinez plusieurs conditions, chaque condition doit être mise entre parenthèses, et utilisez
&(ET),|(OU) pour les relier, et vous ne pouvez pas utiliser lesand、ormots-clés de Python.
isin et where
Filtrage avec isin
Exemple
df = pd.DataFrame({
"Nom": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu", "Qian Qi"],
"Ville": ["Beijing", "Shanghai", "Guangzhou", "Beijing", "Shenzhen"],
"Department": ["Tech", "Sales", "Tech", "Operations", "Tech"]
})
# Filtrer dans une liste
print("La ville est Beijing ou Shanghai :")
print(df[df["City"].isin(["Beijing", "Shanghai"])])
print()
# Pas dans la liste
print("La ville n'est ni Beijing ni Shanghai :")
print(df[~df["City"].isin(["Beijing", "Shanghai"])])
print()
# isin multi-colonnes
df2 = pd.DataFrame({
"City": ["Beijing", "Shanghai"],
"Department": ["Tech", "Sales"]
})
print("Satisfait à la fois la ville et le département :")
print(df[df[["City", "Department"]].isin(df2).all(axis=1)])
where Condition
Exemple
import numpy as np
df = pd.DataFrame({
"A": [1, 5, 3, 7],
"B": [4, 2, 8, 3]
})
# where: conserver les valeurs qui satisfont à la condition, définir les autres sur NaN ou une valeur spécifiée
print("Les valeurs supérieures à 3 sont conservées, les autres sont mises à 0 :")
result = df.where(df > 3, 0)
print(result)
print()
# Utiliser un autre DataFrame comme condition
other = pd.DataFrame({
"A": [True, False, True, False],
"B": [False, True, False, True]
})
print("Filtrer selon le DataFrame de condition :")
print(df.where(other, -1))
Filtrage de chaînes
Exemple
df = pd.DataFrame({
"Nom": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu", "Sun Qi"],
"Ville": ["Beijing", "Shanghai", "Guangzhou", "Shenzhen", "Hangzhou"],
"Email": ["[email protected]", "[email protected]", "[email protected]",
"[email protected]", "[email protected]"]
})
# Contient
print("City contient 'Beijing' :")
print(df[df["City"].str.contains("Beijing")])
print()
# Commence par / Se termine par
print("Email commence par zhang :")
print(df[df["Email"].str.startswith("zhang")])
print()
# Correspondance Regex
print("Longueur du nom d'utilisateur de l'e-mail supérieure à 4:")
print(df[df["Email"].str.extract(r"(\w+)@")[0].str.len() > 4])
print()
# Correspondance de motifs multiples
print("La ville commence par Bei, Shang, Guang ou Shen:")
print(df[df["City"].str.contains("^Bei|^Shang|^Guang|^Shen")])
Filtrage par plage numérique
Exemple
df = pd.DataFrame({
"Nom": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu", "Qian Qi"],
"Âge": [25, 30, 28, 35, 22],
"Salaire": [12000, 15000, 11000, 18000, 9000]
})
# Filtrage par plage
print("Âge entre 25 et 30 (inclus):")
print(df[df["Age"].between(25, 30)])
print()
# Filtrage par quantile
q1 = df["Salary"].quantile(0.25)
q3 = df["Salary"].quantile(0.75)
print(f"Salaire entre 25% et 75% ({q1}-{q3}) :")
print(df[df["Salary"].between(q1, q3)])
print()
# N lignes du haut/bas
print("3 salaires les plus élevés :")
print(df.nlargest(3, "Salary"))
print()
print("2 salaires les plus bas :")
print(df.nsmallest(2, "Salary"))
Filtrage des données temporelles
Exemple
# Créer des données de séries temporelles
df = pd.DataFrame({
"Date": pd.date_range("2024-01-01", periods=10, freq="D"),
"Ventes": [100, 120, 90, 150, 200, 180, 110, 130, 170, 190]
})
df = df.set_index("Date")
print("Données de séries temporelles :")
print(df)
print()
# Filtrer par date
print("Données pour 2024-01-05 :")
print(df.loc["2024-01-05"])
print()
# Filtrage par plage de dates
print("Du 2024-01-03 au 2024-01-07 :")
print(df.loc["2024-01-03":"2024-01-07"])
print()
# Utiliser truncate (découpage plus efficace)
print("filtrage par truncate :")
print(df.truncate(before="2024-01-03", after="2024-01-07"))
Méthode query
queryLa méthode fournit une approche de filtrage plus concise de style SQL.
Exemple
df = pd.DataFrame({
"FullName": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu"],
"Âge": [25, 30, 28, 35],
"Ville": ["Beijing", "Shanghai", "Guangzhou", "Beijing"],
"Salaire": [12000, 15000, 11000, 18000]
})
# Utiliser la méthode query
print("Age>26 and City='Beijing':")
print(df.query("Age > 26 and City == 'Beijing'"))
print()
# Utilisation des variables
min_age = 26
city = "Beijing"
print(f"Age>{min_age} et City={city}:")
print(df.query("Age > @min_age and City == @city"))
print()
# Lorsque les noms de colonnes contiennent des espaces, utilisez des accents graves
df2 = df.rename(columns={"FullName": "Full Name"})
print("Lorsqu'un nom de colonne contient un espace :")
print(df2.query("`Full Name` == 'Zhang San'"))
Problèmes courants
1. Erreur lors de la combinaison de conditions
Lors du filtrage avec plusieurs conditions, utilisez des parenthèses pour clarifier la priorité, et utilisez&、|plutôt queand、or。
2. Les chaînes de caractères contiennent des valeurs nulles
Utiliserstr.containsAvant [d'utiliser], les valeurs nulles doivent être traitées :df[df["列"].str.contains("x", na=False)]
3. Filtrage par index
Si le DataFrame a un index personnalisé, faites attention àlocetilocla différence.
Autres extensionsPour les requêtes complexes à conditions multiples,
queryLa syntaxe de cette méthode est plus proche du langage naturel, ce qui rend le code plus lisible. Lorsque le volume de données est important,loclorsqu'elle est combinée avec des tableaux booléens, elle est généralementqueryplus rapide.