Skip to content

Pandas: Zeilen mit mehreren Bedingungen auswählen

Python

In diesem Artikel wird beschrieben, wie SIE Zeilen von Pandas. DataFrame anhand mehrerer Bedingungen auswählen.

  • Grundlegende Methode zum Auswählen von Zeilen von pandas.DataFrame
  • Wählen Sie Zeilen mit mehreren Bedingungen aus
  • Die Operatorpriorität

Zwei Punkte sind zu beachten:

  1. Verwenden Sie &、|、~ (nicht und, oder, nicht)
  2. Schließen Sie jeden bedingten Ausdruck in Klammern ein, wenn Sie Vergleichsoperatoren verwenden

Fehler bei Verwendung von and, or, not:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Fehler wenn keine Klammern:

TypeError: cannot compare a dtyped [object] array with a scalar of type [bool]

Im Beispielcode WIRD sterben folgende CSV-Datei gelesen und verwendet.

import pandas as pd

df = pd.read_csv('data/src/sample_pandas_normal.csv')
print(df)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

Der Beispielcode used pandas.DataFrame, aber dasselbe gilt für pandas.Series.

Grundlegende Methode zum Auswählen von Zeilen von pandas.DataFrame

Mit Einer Liste, Einem Array oder pandas.Series of boolean bool can SIE Zeilen auswählen, sterben True Sind.

mask = [True, False, True, False, True, False]
df_mask = df[mask]
print(df_mask)
#       name  age state  point
# 0    Alice   24    NY     64
# 2  Charlie   18    CA     70
# 4    Ellen   24    CA     88

Wählen Sie Zeilen mit mehreren Bedingungen aus

Sie können pandas.Series of bool erhalten, was ein UND von zwei Bedingungen ist, indem Sie & verwenden.

Beachten Sie, dass == und ~ hier zur Erklärung als zweite Bedingung used Werden, aber SIE can Auch != verwenden.

print(df['age'] < 35)
# 0     True
# 1    False
# 2     True
# 3    False
# 4     True
# 5     True
# Name: age, dtype: bool

print(~(df['state'] == 'NY'))
# 0    False
# 1     True
# 2     True
# 3     True
# 4     True
# 5    False
# Name: state, dtype: bool

print((df['age'] < 35) & ~(df['state'] == 'NY'))
# 0    False
# 1    False
# 2     True
# 3    False
# 4     True
# 5    False
# dtype: bool

Verwenden Sie dies, um nur True-Zeilen auszuwählen.

df_and = df[(df['age'] < 35) & ~(df['state'] == 'NY')]
print(df_and)
#       name  age state  point
# 2  Charlie   18    CA     70
# 4    Ellen   24    CA     88

Verwenden Sie Sie | für ODER.

print((df['age'] < 20) | (df['point'] > 90))
# 0    False
# 1     True
# 2     True
# 3    False
# 4    False
# 5    False
# dtype: bool

df_or = df[(df['age'] < 20) | (df['point'] > 90)]
print(df_or)
#       name  age state  point
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70

Im following Artikel erfahren SIE, warum SIE &, |, ~ anstelle von and, or, not verwenden müssen und warum Klammern erforderlich sind.

Die Operatorpriorität

Die Rangfolge der Operatoren in Python ist ~ > & > |.

Bei drei oder mehr Bedingungen können die Ergebnisse je nach Reihenfolge variieren.

df_multi_1 = df[(df['age'] < 35) | ~(df['state'] == 'NY') & (df['point'] < 75)]
print(df_multi_1)
#       name  age state  point
# 0    Alice   24    NY     64
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

df_multi_2 = df[(df['age'] < 35) & (df['point'] < 75) | ~(df['state'] == 'NY')]
print(df_multi_2)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

Es ist sicherer, sie in Klammern einzuschließen.

df_multi_3 = df[((df['age'] < 35) | ~(df['state'] == 'NY')) & (df['point'] < 75)]
print(df_multi_3)
#       name  age state  point
# 0    Alice   24    NY     64
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 5    Frank   30    NY     57