Pandas df.query()-Funktion

Pandas 常用函数Gängige Pandas-Funktionen


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

import pandas as pd

# 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:

  1. Filterbedingungen werden in Anführungszeichen gesetzt und verwenden eine SQL-ähnliche Syntax.
  2. Numerische Vergleiche verwenden>, ==, <und andere Operatoren.
  3. 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

import pandas as pd

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 &gt; 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 &gt;= 18 and age &lt;= 20 and score != 88&#039;))

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:

  1. Verwenden Sieandzur Darstellung der logischen AND-Operation.
  2. Verwenden Sieorzur Darstellung der logischen OR-Operation.
  3. Verwenden Sienotzur Darstellung der logischen NOT-Operation.
  4. 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

import pandas as pd

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 &gt; @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 &gt; @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ürinin-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

import pandas as pd

# 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 dieinSchlü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

import pandas as pd

# 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` &gt; 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` &gt; 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.

Pandas 常用函数Gängige Pandas-Funktionen

Andere Erweiterungen