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
# 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
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
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 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
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
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
# 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
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.
Weitere ErweiterungenFü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.