Pandas-Filterung und bedingte Abfrage

Datenfilterung ist eine der häufigsten Operationen in der Datenanalyse. Pandas bietet umfangreiche Funktionen für bedingte Abfragen, mit denen Sie Daten anhand verschiedener Bedingungen filtern können. Dieser Abschnitt stellt verschiedene Methoden zur Datenfilterung im Detail vor.


Grundlegende bedingte Filterung

Filterung mit einer einzelnen Bedingung

Beispiel

import pandas as pd

# Beispieldaten erstellen
df = pd.DataFrame({
    "Name": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu", "Qian Qi"],
    "Alter": [25, 30, 28, 35, 22],
    "City": ["Beijing", "Shanghai", "Guangzhou", "Peking", "Shenzhen"],
    "Salary": [12000, 15000, 11000, 18000, 9000],
    "Abteilung": ["Technik", "Vertrieb", "Technik", "Betrieb", "Technik"]
})

print(Rohdaten:)
print(df)
print()

# Gleichheitsfilterung
print("Stadt ist gleich Peking:")
print(df[df["City"] == "Peking"])
print()

# Ungleichheitsfilterung
print("Stadt ungleich Peking:")
print(df[df["City"] != "Peking"])
print()

# Größer als und kleiner als
print("Gehalt größer als 12000:")
print(df[df["Salary"] > 12000])
print()

# String-Bedingung
print("Name enthält 'San':")
print(df[df["Name"].str.contains("San")])

Mehrere Bedingungen kombinieren

Beispiel

import pandas as pd

df = pd.DataFrame({
    "Name": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu", "Qian Qi"],
    "Alter": [25, 30, 28, 35, 22],
    "City": ["Beijing", "Shanghai", "Guangzhou", "Peking", "Shenzhen"],
    "Salary": [12000, 15000, 11000, 18000, 9000],
    "Abteilung": ["Technik", "Vertrieb", "Technik", "Betrieb", "Technik"]
})

# UND-Bedingung: &-Operator verwenden
print("Peking und Gehalt>10000:")
print(df[(df["City"] == "Peking") & (df["Salary"] > 10000)])
print()

# ODER-Bedingung: Operator | verwenden
print("Tech-Abteilung oder Salary>15000:")
print(df[(df["Department"] == "Tech") | (df["Salary"] > 15000)])
print()

# NICHT-Bedingung: Operator ~ verwenden
print("Nicht Tech-Abteilung:")
print(df[~(df["Department"] == "Tech")])
print()

# Komplexe Kombination
print("(Beijing und Age>25) oder (Shanghai):")
print(df[((df["City"] == "Peking") & (df["Age"] > 25)) | (df["City"] == "Shanghai")])

Wenn mehrere Bedingungen kombiniert werden, muss jede Bedingung in Klammern gesetzt werden, und verwenden Sie&(UND),|(ODER) zum Verbinden, und Sie dürfen nicht Pythonsand、orSchlüsselwörter verwenden.


isin und where

isin-Filterung

Beispiel

import pandas as pd

df = pd.DataFrame({
    "Name": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu", "Qian Qi"],
    "City": ["Beijing", "Shanghai", "Guangzhou", "Peking", "Shenzhen"],
    "Abteilung": ["Technik", "Vertrieb", "Technik", "Betrieb", "Technik"]
})

# Innerhalb einer Liste filtern
print("Stadt ist Beijing oder Shanghai:")
print(df[df["City"].isin(["Beijing", "Shanghai"])])
print()

# Nicht in der Liste
print("Stadt ist nicht Beijing oder Shanghai:")
print(df[~df["City"].isin(["Beijing", "Shanghai"])])
print()

# Mehrspaltiges isin
df2 = pd.DataFrame({
    "Stadt": ["Beijing", "Shanghai"],
    "Department": ["Tech", "Sales"]
})
print("Erfüllt sowohl Stadt als auch Abteilung:")
print(df[df[["City", "Department"]].isin(df2).all(axis=1)])

where Bedingung

Beispiel

import pandas as pd
import numpy as np

df = pd.DataFrame({
    "A": [1, 5, 3, 7],
    "B": [4, 2, 8, 3]
})

# where: Werte, die die Bedingung erfüllen, behalten, andere auf NaN oder einen angegebenen Wert setzen
print("Werte größer als 3 werden beibehalten, andere werden auf 0 gesetzt:")
result = df.where(df > 3, 0)
print(result)
print()

# Verwende ein anderes DataFrame als Bedingung
other = pd.DataFrame({
    "A": [True, False, True, False],
    "B": [False, True, False, True]
})
print("Filtern basierend auf dem Bedingungs-DataFrame:")
print(df.where(other, -1))

String-Filterung

Beispiel

import pandas as pd

df = pd.DataFrame({
    "Name": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu", "Sun Qi"],
    "City": ["Beijing", "Shanghai", "Guangzhou", "Shenzhen", "Hangzhou"],
    "Email": ["[email protected]", "[email protected]", "[email protected]",
             "[email protected]", "[email protected]"]
})

# Enthält
print("City enthält 'Beijing':")
print(df[df["City"].str.contains("Beijing")])
print()

# Beginnt mit / Endet mit
print("Email beginnt mit zhang:")
print(df[df["Email"].str.startswith("zhang")])
print()

# Regex-Übereinstimmung
print("Länge des E-Mail-Benutzernamens größer als 4:")
print(df[df["Email"].str.extract(r"(\w+)@")[0].str.len() > 4])
print()

# Mehrfach-Musterabgleich
print("Stadt beginnt mit Bei, Shang, Guang oder Shen:")
print(df[df["City"].str.contains("^Bei|^Shang|^Guang|^Shen")])

Numerische Bereichsfilterung

Beispiel

import pandas as pd

df = pd.DataFrame({
    "Name": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu", "Qian Qi"],
    "Alter": [25, 30, 28, 35, 22],
    "Salary": [12000, 15000, 11000, 18000, 9000]
})

# Bereichsfilterung
print("Alter zwischen 25 und 30 (inklusive):")
print(df[df["Age"].between(25, 30)])
print()

# Quantilfilterung
q1 = df["Salary"].quantile(0.25)
q3 = df["Salary"].quantile(0.75)
print(f"Salary zwischen 25% und 75% ({q1}-{q3}):")
print(df[df["Salary"].between(q1, q3)])
print()

# Obere/untere N Zeilen
print("Top 3 Gehälter:")
print(df.nlargest(3, "Salary"))
print()

print("Untere 2 Gehälter:")
print(df.nsmallest(2, "Salary"))

Zeitdatenfilterung

Beispiel

import pandas as pd

# Zeitreihendaten erstellen
df = pd.DataFrame({
    "Date": pd.date_range("2024-01-01", periods=10, freq="D"),
    "Verkäufe": [100, 120, 90, 150, 200, 180, 110, 130, 170, 190]
})
df = df.set_index("Date")

print("Zeitreihendaten:")
print(df)
print()

# Nach Datum filtern
print("Daten für 2024-01-05:")
print(df.loc["2024-01-05"])
print()

# Filterung nach Datumsbereich
print("Von 2024-01-03 bis 2024-01-07:")
print(df.loc["2024-01-03":"2024-01-07"])
print()

# truncate verwenden (effizienteres Slicing)
print("truncate-Filterung:")
print(df.truncate(before="2024-01-03", after="2024-01-07"))

query-Methode

queryDie Methode bietet einen prägnanteren Filteransatz im SQL-Stil.

Beispiel

import pandas as pd

df = pd.DataFrame({
    "FullName": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu"],
    "Alter": [25, 30, 28, 35],
    "City": ["Beijing", "Shanghai", "Guangzhou", "Beijing"],
    "Salary": [12000, 15000, 11000, 18000]
})

# Die query-Methode verwenden
print("Age>26 and City='Beijing':")
print(df.query("Age > 26 and City == 'Beijing'"))
print()

# Variablen verwenden
min_age = 26
city = "Beijing"
print(f"Age>{min_age} und City={city}:")
print(df.query("Age > @min_age and City == @city"))
print()

# Wenn Spaltennamen Leerzeichen enthalten, Backticks verwenden
df2 = df.rename(columns={"FullName": "Full Name"})
print("Wenn ein Spaltenname ein Leerzeichen enthält:")
print(df2.query("`Full Name` == 'Zhang San'"))

Häufige Probleme

1. Fehler beim Kombinieren von Bedingungen

Beim Filtern mit mehreren Bedingungen verwenden Sie Klammern, um die Priorität zu verdeutlichen, und verwenden Sie&、|stattand、or。

2. Strings enthalten Nullwerte

Verwenden Siestr.containsVor [der Verwendung] müssen Nullwerte behandelt werden:df[df["列"].str.contains("x", na=False)]

3. Indexfilterung

Wenn das DataFrame einen benutzerdefinierten Index hat, beachten Sielocundilocden Unterschied.

Für komplexe Abfragen mit mehreren Bedingungen,queryDie Syntax dieser Methode ist näher an der natürlichen Sprache, was den Code lesbarer macht. Wenn die Datenmenge groß ist,locin Kombination mit booleschen Arrays ist sie normalerweisequeryschneller.

Weitere Erweiterungen