Pandas df.query()-Funktion
query()ist eine sehr praktische Datenfilterfunktion in Pandas. Sie ermöglicht die Verwendung SQL-ähnlicher Zeichenkettenausdrücke zum Filtern von Daten. Im Vergleich zu traditionellen booleschen Indexierungsmethoden,query()ist ihre Syntax prägnanter und intuitiver, besonders geeignet für die Handhabung komplexer Filterbedingungen.
In der Datenanalyse ist es oft notwendig, Daten nach verschiedenen Bedingungen zu filtern.query()Die Funktion schreibt Filterbedingungen in Zeichenkettenform, genau wie das Schreiben von SQL-Abfragen, was für Benutzer, die mit SQL vertraut sind, sehr benutzerfreundlich ist. Gleichzeitig unterstützt sie auch die Verwendung von Python-Variablen und -Funktionen, wodurch dynamisches Filtern möglich wird.
Grundlegende Syntax und Parameter
query()ist eine Methode von DataFrame, die über den Punktoperator aufgerufen wird.Sie akzeptiert einen Zeichenkettenparameter, der den Filterausdruck enthält.
Syntaxformat
DataFrame.query(expr, inplace=False, **kwargs)
Parameterbeschreibung
| Parameter | Type | Erforderlich | Beschreibung | Standardwert |
|---|---|---|---|---|
| expr | str | Erforderlich | Filterausdruck, ähnlich der WHERE-Klausel in SQL. | - |
| inplace | bool | Optional | Ob das ursprüngliche DataFrame direkt geändert werden soll. | False |
Beschreibung des Rückgabewerts
- Rückgabetyp: Gibt ein neues DataFrame zurück, das die Zeilen enthält, welche die Filterbedingungen erfüllen.
- Originaldaten werden nicht geändert: Standardmäßig bleibt das ursprüngliche DataFrame unverändert.
Beispiele
Anhand reichhaltiger Beispiele wollen wir vollständig beherrschenquery()die Verwendung von
Beispiel 1: Grundlegende Verwendung - Filterung mit einer Bedingung
Die einfachstequery()Verwendung besteht darin, mit einer einzigen Bedingung zu filtern.
Beispiel
# Beispiel-DataFrame erstellen
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank', 'Grace'],
'age': [18, 19, 17, 18, 20, 19, 18],
'score': [85, 92, 78, 90, 88, 95, 82],
'grade': ['A', 'A', 'B', 'A', 'B', 'A', 'B']
}
df = pd.DataFrame(data)
print("Ursprüngliches DataFrame:")
print(df)
print()
# Studenten mit Punktzahl größer als 85 filtern
print("Studenten mit Punktzahl größer als 85:")
print(df.query('score > 85'))
print()
# Studenten, deren Alter gleich 18 ist, filtern
print("Studenten, deren Alter gleich 18 ist:")
print(df.query('age == 18'))
print()
# Studenten mit Note A filtern
print("Studenten mit Note A:")
print(df.query('grade == "A"'))
Ausführungsergebnis:
原始 DataFrame:
name age score grade
0 Alice 18 85 A
1 Bob 19 92 A
2 Charlie 17 78 B
3 David 18 90 A
4 Eve 20 88 B
5 Frank 19 95 A
6 Grace 18 82 B
分数大于 85 的学生:
name age score grade
1 Bob 19 92 A
3 David 18 90 A
4 Eve 20 88 B
5 Frank 19 95 A
年龄等于 18 的学生:
name age score grade
0 Alice 18 85 A
3 David 18 90 A
6 Grace 18 82 B
等级为 A 的学生:
name age score grade
0 Alice 18 85 A
1 Bob 19 92 A
3 David 18 90 A
5 Frank 19 95 A
Code-Erklärung:
- Filterbedingungen werden in Anführungszeichen gesetzt und verwenden eine SQL-ähnliche Syntax.
- Numerische Vergleiche verwenden
>,==,<und andere Operatoren. - Zeichenkettenvergleiche verwenden doppelte Anführungszeichen oder einfache Anführungszeichen.
Beispiel 2: Filterung mit zusammengesetzten Bedingungen
query()Unterstützt die Verwendung logischer Operatoren zum Kombinieren mehrerer Bedingungen.
Beispiel
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank', 'Grace'],
'age': [18, 19, 17, 18, 20, 19, 18],
'score': [85, 92, 78, 90, 88, 95, 82],
'grade': ['A', 'A', 'B', 'A', 'B', 'A', 'B']
}
df = pd.DataFrame(data)
# AND-Bedingung verwenden: score größer als 85 und age kleiner als 19
print("Studierende mit score größer als 85 und age kleiner als 19:")
print(df.query('score > 85 and age 90'))
print()
# NOT-Bedingung verwenden: grade ist nicht A
print("Studierende, deren grade nicht A ist:")
print(df.query('not grade == "A"'))
print()
# Komplexe zusammengesetzte Bedingung
print("Studierende im Alter zwischen 18 und 20 mit Punktzahl ungleich 88:")
print(df.query('age >= 18 and age <= 20 and score != 88'))
Ausführungsergebnis:
分数大于 85 且年龄小于 19 的学生:
name age score grade
3 David 18 90 A
5 Frank 19 95 A
等级为 A 或分数大于 90 的学生:
name age score grade
1 Bob 19 92 A
3 David 18 90 A
5 Frank 19 95 A
等级不为 A 的学生:
name age score grade
2 Charlie 17 78 B
4 Eve 20 88 B
6 Grace 18 82 B
年龄在 18 到 20 之间且分数不等于 88 的学生:
name age score grade
0 Alice 18 85 A
1 Bob 19 92 A
3 David 18 90 A
5 Frank 19 95 A
Code-Erklärung:
- Verwenden Sie
andzur Darstellung der logischen AND-Operation. - Verwenden Sie
orzur Darstellung der logischen OR-Operation. - Verwenden Sie
notzur Darstellung der logischen NOT-Operation. - Zusammengesetzte Bedingungen können beliebig kombiniert werden, um komplexe Filterlogik zu bilden.
Beispiel 3: Verwendung von Python-Variablen
query()Unterstützt die Verwendung von Python-Variablen in Ausdrücken, was bei dynamischen Abfragen sehr nützlich ist.
Beispiel
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank', 'Grace'],
'age': [18, 19, 17, 18, 20, 19, 18],
'score': [85, 92, 78, 90, 88, 95, 82],
'grade': ['A', 'A', 'B', 'A', 'B', 'A', 'B']
}
df = pd.DataFrame(data)
# Verwende das @-Symbol, um auf Python-Variablen zu verweisen
min_score = 85
target_grade = 'A'
print("Filterung mit Variable - Punktzahl größer als {}:".format(min_score))
print(df.query('score > @min_score'))
print()
print("Filterung mit Variable - Note ist '{}':".format(target_grade))
print(df.query('grade == @target_grade'))
print()
# Eine Liste als Variable verwenden
target_grades = ['A', 'B']
print("Studierende mit Noten in {}:".format(target_grades))
print(df.query('grade in @target_grades'))
print()
# Eine Python-Funktion verwenden
def get_average_score(df):
return df['score'].mean()
print("Studierende mit Punktzahlen über dem Durchschnitt:")
print(df.query('score > @get_average_score(df)'))
Ausführungsergebnis:
使用变量筛选 - 分数大于 85:
name age score grade
1 Bob 19 92 A
3 David 18 90 A
4 Eve 20 88 B
5 Frank 19 95 A
使用变量筛选 - 等级为 'A':
name age score grade
0 Alice 18 85 A
1 Bob 19 92 A
3 David 18 90 A
5 Frank 19 95 A
等级在 ['A', 'B'] 中的学生:
name age score grade
0 Alice 18 85 A
1 Bob 19 92 A
2 Charlie 17 78 B
3 David 18 90 A
4 Eve 20 88 B
5 Frank 19 95 A
6 Grace 18 82 B
分数高于平均分的学生:
name age score grade
1 Bob 19 92 A
3 David 18 90 A
5 Frank 19 95 A
Code-Erklärung:
- Verwenden Sie die
@Symbol zum Referenzieren von Python-Variablen in Abfrageausdrücken. - Sie können Python-Listen direkt für
inin-Prüfungen. - Sie können Python-Funktionen aufrufen, um dynamische Schwellenwerte zu berechnen.
Beispiel 4: String-Operationen
query()Es unterstützt auch einige gängige String-Operationen.
Beispiel
# DataFrame mit String-Spalten erstellen
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank', 'Grace'],
'city': ['Beijing', 'Shanghai', 'Beijing', 'Guangzhou', 'Shanghai', 'Beijing', 'Shenzhen'],
'score': [85, 92, 78, 90, 88, 95, 82]
}
df = pd.DataFrame(data)
# Datensätze für eine bestimmte Stadt filtern
print("Studierende in Beijing:")
print(df.query('city == "Beijing"'))
print()
# Prüfung auf Enthaltensein von Zeichenketten (mit in)
print("Studierende in Shanghai oder Beijing:")
print(df.query('city in ["Shanghai", "Beijing"]'))
print()
# @ verwenden, um auf eine Variable zu verweisen, die eine Zeichenkette enthält
target_city = 'Guangzhou'
print("Studierende in {}:".format(target_city))
print(df.query('city == @target_city'))
Ausführungsergebnis:
在北京的学生:
name city score
0 Alice Beijing 85
2 Charlie Beijing 78
5 Frank Beijing 95
在上海或北京的学生:
name city score
0 Alice Beijing 85
1 Bob Shanghai 92
2 Charlie Beijing 78
4 Eve Shanghai 88
5 Frank Beijing 95
在 Guangzhou 的学生:
name city score
3 David Guangzhou 90
Code-Erklärung:
query()Unterstützt den Gleichheitsvergleich von Zeichenketten.- Sie können die
inSchlüsselwort, um zu prüfen, ob ein Element in einer Liste enthalten ist. - Sie können
@um auf Zeichenkettenvariablen zu verweisen.
Beispiel 5: Umgang mit Spaltennamen mit Leerzeichen oder Sonderzeichen
Wenn Spaltennamen Leerzeichen oder Sonderzeichen enthalten, können Backticks `` ` `` verwendet werden, um die Spaltennamen zu umschließen.
Beispiel
# Erstelle einen DataFrame mit Spaltennamen, die Leerzeichen enthalten
data = {
'student name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'score': [85, 92, 78, 90, 88],
'pass status': [True, True, False, True, True]
}
df = pd.DataFrame(data)
print("Ursprünglicher DataFrame (Spaltennamen enthalten Leerzeichen):")
print(df)
print()
# Verwende Backticks, um Spaltennamen zu umschließen
print("Studenten mit Punktzahl größer als 85:")
print(df.query('`score` > 85'))
print()
print("Studierende mit pass status True:")
print(df.query('`pass status` == True'))
print()
# Diese Methode kann auch reservierte Wörter als Spaltennamen verarbeiten
df2 = pd.DataFrame({
'class': ['A', 'B', 'A', 'B', 'A'],
'def': [1, 2, 3, 4, 5] # def ist ein reserviertes Wort in Python
})
print("Verwenden eines reservierten Wortes als Spaltenname:")
print(df2.query('`def` > 3'))
Ausführungsergebnis:
原始 DataFrame(列名包含空格): student name score pass status 0 Alice 85 True 1 Bob 92 True 2 Charlie 78 False 3 David 90 True 4 Eve 88 True 分数大于 85 的学生: student name score pass status 1 Bob 92 True 3 David 90 True 4 Eve 88 True 通过状态为 True 的学生: student name score pass status 0 Alice 85 True 1 Bob 92 True 3 David 90 True 4 Eve 88 True 使用保留字作为列名: class def 3 B 4 4 A 5
Code-Erklärung:
- Durch die Verwendung von Backticks können Fälle behandelt werden, in denen Spaltennamen Leerzeichen enthalten oder mit reservierten Wörtern von Python in Konflikt geraten.
`score`und`pass status`Backticks werden verwendet, um auf Spaltennamen zu verweisen.`def`Es zeigt, wie mit reservierten Python-Wörtern als Spaltennamen umgegangen wird.
Hinweise
query()Spaltennamen in Ausdrücken müssen gültige Python-Bezeichner sein oder in Backticks eingeschlossen werden.- String-Vergleiche können einfache oder doppelte Anführungszeichen verwenden.
- Verwenden Sie die
@Symbol zum Verweisen auf Python-Variablen. - Für große DataFrames,
query()ist die Leistung normalerweise besser als bei traditioneller boolescher Indizierung. - Wenn der Filterausdruck reservierte Wörter oder Sonderzeichen enthält, müssen Backticks verwendet werden.
Tipp:
query()Besonders geeignet für Szenarien, in denen Filterbedingungen dynamisch konstruiert werden müssen, z. B. beim Filtern von Daten basierend auf Benutzereingaben oder Konfigurationsdateien. In Kombination mit den String-Formatierungsfunktionen von Python lassen sich sehr flexible Datenabfragen realisieren.
Zusammenfassung
query()ist eine leistungsstarke Datenfilterfunktion in Pandas. Sie bietet eine SQL-ähnliche Abfragesyntax, wodurch komplexe bedingte Filterung prägnanter und lesbarer wird.
Zu seinen Hauptvorteilen gehören: eine prägnante und intuitive Syntax, Unterstützung für zusammengesetzte logische Operationen, Unterstützung für Python-Variablen und -Funktionen sowie die Fähigkeit, mit speziellen Spaltennamen umzugehen. In der tatsächlichen Datenanalyse, insbesondere wenn Filterbedingungen dynamisch erstellt werden müssen,query()ist es ein sehr praktisches Werkzeug.
Gängige Pandas-Funktionen