HOWTO · Pandas

So ermitteln Sie in Pandas die Indizes aller Zeilen, deren Wert in einer bestimmten Spalte eine Bedingung erfüllt

Wir können Indizes aller Zeilen erhalten, deren bestimmte Spalte die gegebene Bedingung in Pandas erfüllt, indem wir eine einfache Indexierungsoperation, die np.where() Funktion und die query()-Methode verwenden.

Auf dieser Seite

Um Zeilen zu erhalten, in denen eine Pandas-Spalte eine Bedingung erfüllt, verwenden Sie die boolesche Indizierung und lesen Sie .index des gefilterten DataFrame aus. Das liefert Indexlabels, die Zeilen kennzeichnen und von ihren numerischen Positionen abweichen können. Mit np.where() erhalten Sie stattdessen Positionen im Bedingungsarray; DataFrame.query() filtert Zeilen anhand eines Ausdrucks und behält ebenfalls ihre Indexlabels bei. Wählen Sie das Ergebnis, das Sie im nächsten Schritt benötigen.

Mit boolescher Indizierung die Indizes passender Zeilen ermitteln

Ein Vergleich wie df["Sales"] >= 300 erstellt eine boolesche Series, deren Werte den Zeilen des DataFrame zugeordnet sind. Verwenden Sie diese Series in df[...], um die passenden Zeilen auszuwählen, und greifen Sie anschließend auf .index zu. Mit .tolist() wandeln Sie den Index in eine gewöhnliche Python-Liste um, die sich leichter an eine andere Funktion übergeben oder anzeigen lässt.

Führen Sie dieses Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

import pandas as pd

df = pd.DataFrame(
    {"Sales": [200, 300, 400, 200, 300, 300]},
    index=[10, 11, 12, 13, 14, 15],
)
mask = df["Sales"] >= 300
matching_rows = df[mask]
print(mask.tolist())
print(matching_rows)
print(matching_rows.index.tolist())

Die Maske kennzeichnet jede Zeile, deren Wert in Sales mindestens 300 beträgt. matching_rows.index enthält die Labels der ausgewählten Zeilen; .tolist() wandelt sie in eine Liste um. In diesem Beispiel unterscheiden sich die Labels bewusst von den Positionen der Zeilen, sodass der Unterschied sichtbar wird.

Indexlabels und Zeilenpositionen verstehen

Ein Indexlabel ist die Kennung, die im Index eines DataFrame gespeichert ist. Eine Zeilenposition ist ihr nullbasierter Versatz in der aktuellen Reihenfolge der Zeilen. Bei einem standardmäßigen RangeIndex sehen Labels oft wie Positionen aus, doch das ist nur ein praktischer Zufall. Ein gefilterter DataFrame behält die ursprünglichen Labels bei, statt seine Zeilen neu zu nummerieren. Verwenden Sie .index, wenn Sie diese Kennungen benötigen; ein Positionsergebnis ist passend, wenn eine API Versätze im aktuellen Array oder in der aktuellen Zeilenreihenfolge erwartet.

Mit np.where() die Positionen passender Zeilen ermitteln

np.where() ist eine NumPy-Funktion und keine Pandas-Methode. Bei einer eindimensionalen booleschen Bedingung gibt sie ein Tupel mit einem Array der Positionen zurück, an denen die Bedingung wahr ist. Wählen Sie mit [0] das erste Tupelelement aus, um das eindimensionale Array der Zeilenpositionen zu erhalten. Diese Positionen beziehen sich auf das boolesche Array, nicht auf die Indexlabels des DataFrame. Bei einem benutzerdefinierten Index können sie daher voneinander abweichen.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

import numpy as np
import pandas as pd

df = pd.DataFrame({"Sales": [200, 300, 400, 200, 300, 300]}, index=[10, 11, 12, 13, 14, 15])
mask = df["Sales"] >= 300
positions = np.where(mask.to_numpy())[0]
print(positions.tolist())

Verwenden Sie np.where(mask.to_numpy())[0], wenn Sie gezielt die Positionen passender Zeilen benötigen. Wenn Sie den gesamten Aufruf in list(...) einschließen, erhalten Sie eine Liste, die das Array aus dem Tupel enthält; das ist nicht dieselbe flache Liste von Positionen. Für Indexlabels verwenden Sie stattdessen vorzugsweise .index des gefilterten DataFrame.

Mit DataFrame.query() Zeilen filtern und ihren Index abrufen

DataFrame.query() wertet einen Zeichenfolgenausdruck anhand der Spaltennamen aus und gibt die passenden Zeilen als DataFrame zurück. Lesen Sie .index dieses Ergebnisses aus, um die ursprünglichen Labels zu erhalten; verwenden Sie bei Bedarf .tolist(), um daraus eine Liste zu machen. Der Spaltenname und der Vergleich im Ausdruck müssen zum DataFrame passen. Hier wählt die Bedingung Zeilen aus, in denen Sales gleich 300 ist.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

import pandas as pd

df = pd.DataFrame({"Sales": [200, 300, 400, 200, 300, 300]}, index=[10, 11, 12, 13, 14, 15])
labels = df.query("Sales == 300").index.tolist()
print(labels)

Für Labels aus einer Filterung mit einem Ausdruck verwenden Sie df.query("Sales == 300").index. Für Positionen aus einer booleschen Bedingung verwenden Sie np.where(condition)[0]. Boolesche Indizierung ist die direkte Wahl, wenn Sie sowohl die passenden Zeilen als auch ihre Labels benötigen. Die drei Varianten beantworten verwandte Fragen, aber nur die erste und die dritte liefern die Indexlabels des DataFrame.