Boolean filtering keeps only the rows where a condition is true. You build a column of True/False — one value per row — hand it back to the DataFrame, and pandas returns just the True rows.
Where you meet it
- Cleaning data — drop rows with bad or missing values.
- Exploring — "only customers over 30", "only orders from March".
- Every
df[df[...] ...]line you've ever copied from Stack Overflow.
What it does
It turns a question you'd ask about each row ("is age over 30?") into a column of yes/no answers, then uses that column to pick rows. No loop, no if — the whole table is tested at once.
The mask is just a column of yes/no answers — you never loop, you test the whole table at once.
How it works
A comparison on a column is applied to every element and gives back a mask — a Series of booleans:
mask = df['age'] > 30 # → [False, True, True, False, ...]
df[mask] # rows where mask is True
df[df['age'] > 30] # the same thing, in one line
Combine conditions with & (and), | (or), ~ (not) — each condition in its own parentheses:
df[(df['age'] > 30) & (df['city'] == 'Berlin')]
The mask is matched to the rows by index, so it must line up with the frame you apply it to.
Watch out
- Use
&/|, not Python'sand/or— those raise an error on a Series. - Wrap every condition in parentheses.
&binds tighter than>, so without them the expression is parsed wrong. - It's
==for "equals", not=. - Filtering then assigning can trigger a
SettingWithCopyWarning— use.loc[mask, 'col'] = ...to be safe.
Go deeper
Boolean Filtering behält nur die Zeilen, in denen eine Bedingung wahr ist. Du baust eine Spalte aus True/False — ein Wert pro Zeile —, gibst sie an den DataFrame zurück, und pandas liefert nur die True-Zeilen.
Wo es vorkommt
- Datenbereinigung — Zeilen mit fehlerhaften oder fehlenden Werten rauswerfen.
- Explorieren — "nur Kunden über 30", "nur Bestellungen aus dem März".
- Jede
df[df[...] ...]-Zeile, die du je von Stack Overflow kopiert hast.
Was es tut
Es verwandelt eine Frage, die du über jede Zeile stellst ("ist das Alter über 30?"), in eine Spalte aus Ja/Nein-Antworten und benutzt diese Spalte, um Zeilen auszuwählen. Keine Schleife, kein if — die ganze Tabelle wird auf einmal geprüft.
Die Maske ist nur eine Spalte aus Ja/Nein — du schleifst nie, du prüfst die ganze Tabelle auf einmal.
Wie es funktioniert
Ein Vergleich auf einer Spalte wird auf jedes Element angewandt und ergibt eine Maske — eine Series aus Booleans:
mask = df['age'] > 30 # → [False, True, True, False, ...]
df[mask] # Zeilen, in denen mask True ist
df[df['age'] > 30] # dasselbe, in einer Zeile
Bedingungen verknüpfst du mit & (und), | (oder), ~ (nicht) — jede Bedingung in eigenen Klammern:
df[(df['age'] > 30) & (df['city'] == 'Berlin')]
Die Maske wird über den Index den Zeilen zugeordnet, muss also zum DataFrame passen, auf den du sie anwendest.
Worauf achten
- Nimm
&/|, nicht Pythonsand/or— die werfen bei einer Series einen Fehler. - Jede Bedingung einklammern.
&bindet stärker als>, ohne Klammern wird der Ausdruck falsch ausgewertet. - "Gleich" ist
==, nicht=. - Filtern und dann zuweisen kann eine
SettingWithCopyWarningauslösen — sicher ist.loc[mask, 'col'] = ....