HOWTO · Pandas

Index der Zeilen ermitteln, deren Spalte mit einem bestimmten Wert in Pandas übereinstimmt

Dieser Artikel stellt vor, wie man in Pandas den Index von Zeilen erhält, deren Spalte mit einem bestimmten Wert übereinstimmt.

Auf dieser Seite

Um Zeilen abzurufen, die eine Bedingung erfüllen, erstellen Sie eine boolesche Maske und übergeben sie an DataFrame.loc. Möchten Sie nur die zugehörigen Labels erhalten, wenden Sie dieselbe Maske auf DataFrame.index an. Mit tolist() erhalten Sie bei Bedarf eine normale Python-Liste. Index-Labels kennzeichnen Zeilen und müssen keine aufeinanderfolgenden ganzzahligen Positionen sein. Wenn Sie dieselbe Maske wiederverwenden, bleiben die Auswahl der Zeilen und der Labels aufeinander abgestimmt, auch bei einem DataFrame mit benutzerdefinierten Labels. Verwenden Sie DataFrame.loc, wenn Sie die passenden Datensätze weiterverarbeiten möchten, und den Index-Ausdruck, wenn Sie nur die Labels benötigen.

Zeilen anhand numerischer Bedingungen in Pandas auswählen

Dieses Beispiel wählt Zeilen aus, in denen Spalte B den Wert 19 hat, und kombiniert diese Bedingung anschließend mit einer ODER-Bedingung für Spalte C. DataFrame.loc gibt die passenden Zeilen zurück, DataFrame.index ihre Labels. Klammern um jeden Vergleich machen die kombinierte boolesche Bedingung deutlich. Ersetzen Sie in einem echten DataFrame die Beispielspalten und -werte durch die Angaben aus Ihren Daten. Setzen Sie beim Kombinieren von Masken mit | oder & jeden Vergleich in Klammern, damit Python die gewünschte Operation auf jede boolesche Series anwendet.

import numpy as np
import pandas as pd

np.random.seed(0)
df = pd.DataFrame(np.random.randint(1, 20, size=(20, 4)), columns=list("ABCD"))

matches_b = df["B"] == 19
print(df.loc[matches_b])
print(df.index[matches_b].tolist())

matches_b_or_c = (df["B"] == 19) | (df["C"] == 19)
print(df.loc[matches_b_or_c])
print(df.index[matches_b_or_c].tolist())
    A   B  C   D
6   1  19  4  18
9  12  19  3   1
[6, 9]
     A   B   C   D
6    1  19   4  18
9   12  19   3   1
14  12  15  19   1
[6, 9, 14]

Die erste Maske wählt die Zeilen aus, deren Wert in B 19 ist; ihre Labels sind [6, 9]. Die zweite Maske verwendet ODER (|): Eine Zeile wird ausgewählt, wenn B oder C den Wert 19 hat. Die zugehörigen Labels sind [6, 9, 14]. Verwenden Sie & zwischen eingeklammerten Bedingungen, wenn beide wahr sein müssen. Das sind Index-Labels und keine Zeilenpositionen; sie bleiben daher auch dann aussagekräftig, wenn der DataFrame gefiltert oder mit einem benutzerdefinierten Index geladen wurde. DataFrame.index ist ein Attribut und keine Methode. tolist() wandelt die ausgewählten Labels in eine Python-Liste um, ohne eine bestimmte pandas-Indexklasse vorauszusetzen. Sind die ursprünglichen Labels nicht eindeutig, kann das Ergebnis Labels mehrfach enthalten, da jede passende Zeile ihr Index-Label beisteuert.

Zeilenindizes für Zeichenfolgen-Treffer in Pandas abrufen

Für Zeichenfolgenfilter gilt dasselbe Muster: Vergleichen Sie eine Spalte auf exakte Gleichheit mit einem vollständigen Wert oder verwenden Sie str.contains, um nach einer Teilzeichenfolge zu suchen. Exakte Gleichheit eignet sich, wenn der gesamte Zellwert übereinstimmen muss; eine Teilzeichenfolgensuche ist hilfreich, wenn der Wert weiteren Text enthalten kann. Das folgende Beispiel ruft sowohl die passenden Zeilen als auch ihre Labels ab. Die Zeichenfolgen wie blue, charlie und alpha sind englische Beispielwerte und bleiben in den unveränderten Beispielen erhalten. Die Teilzeichenfolgenbedingung verwendet das kleingeschriebene rex, das in Tyrannosaurus rex mit derselben Groß- und Kleinschreibung vorkommt.

import pandas as pd

df = pd.DataFrame(
    {
        "Name": ["blue", "delta", "echo", "charlie", "alpha"],
        "Type": ["Raptors", "Raptors", "Raptors", "Raptors", "Tyrannosaurus rex"],
    }
)

exact_name = df["Name"] == "blue"
print(df.index[exact_name].tolist())
print(df.loc[exact_name])

name_contains_ha = df["Name"].str.contains("ha")
print(df.index[name_contains_ha].tolist())
print(df.loc[name_contains_ha])

name_contains_ha_and_type_contains_rex = name_contains_ha & df["Type"].str.contains("rex")
print(df.loc[name_contains_ha_and_type_contains_rex])
[0]
   Name     Type
0  blue  Raptors
[3, 4]
      Name               Type
3  charlie            Raptors
4    alpha  Tyrannosaurus rex
    Name               Type
4  alpha  Tyrannosaurus rex

Die exakte Gleichheit findet blue und gibt dessen Label zurück. Die Teilzeichenfolge ha trifft auf charlie und alpha zu. In Kombination mit der Bedingung für rex in Type wird die Zeile mit alpha ausgewählt; ihr Label ist [4]. str.contains unterscheidet standardmäßig zwischen Groß- und Kleinschreibung. Achten Sie daher auf die Schreibweise in den Daten oder legen Sie die Option case bewusst fest. Kombinieren Sie Bedingungen mit &, wenn beide Tests zutreffen müssen, und mit |, wenn einer davon genügt; setzen Sie jeden Vergleich in Klammern. Wie bei numerischen Filtern übergeben Sie die Maske an DataFrame.loc, um Zeilen zu erhalten, und an DataFrame.index, um Labels abzurufen. Den Ausdruck für die exakte Übereinstimmung können Sie auf eine andere Spalte übertragen, indem Sie den Spaltennamen und den Vergleichswert ändern. Die Teilzeichenfolgensuche folgt demselben Muster mit einem anderen Suchtext.