Überprüfen Sie, ob ein Wert im Pandas-Datenrahmenindex vorhanden ist

139

Ich bin mir sicher, dass es einen offensichtlichen Weg gibt, dies zu tun, aber ich kann mir momentan nichts Besonderes vorstellen.

Grundsätzlich statt Ausnahme der Anhebung Ich mag bekommen Trueoder Falsezu sehen , ob ein Wert in Pandas existiert dfIndex.

import pandas as pd
df = pd.DataFrame({'test':[1,2,3,4]}, index=['a','b','c','d'])
df.loc['g']  # (should give False)

Was ich jetzt arbeite, ist das Folgende

sum(df.index == 'g')
Abhi
quelle
1
Was ist mit irgendwelchen (df.index == 'g')?
luffe

Antworten:

252

Dies sollte den Trick tun

'g' in df.index
Guillaume Jacquenot
quelle
7
Dies scheint nicht zu funktionieren, wenn mehrere Einträge dieselben Indexwerte verwenden.
MaximG
2
@ MaximG Was meinst du? Dies funktioniert auch für einen nicht eindeutigen Index.
Joris
Arbeiten Sie auch für Multi-Index. Wenn Ihr Index Länge hat n, kann ein Tupel beliebiger Länge 1..nüberprüft werden
Minh Triet
2
Für andere, die hierher kommen, müssen Sie möglicherweise verwenden, 'g' in df.columnswenn Ihr Datenrahmen mit Spaltenüberschriften anstelle eines Index definiert wurde, z. B.:df = pandas.DataFrame({'test':[1,2,3,4]}, columns=['a','b','c','d'])
Tahlor
2
Ist diese konstante Zeit oder linear?
Lokesh
36

Nur als Referenz, da es etwas war, nach dem ich gesucht habe, können Sie das Vorhandensein innerhalb der Werte oder des Index testen, indem Sie die Methode ".values" anhängen, z

g in df.<your selected field>.values
g in df.index.values

Ich finde, dass das Hinzufügen der ".values", um eine einfache Liste oder ndarray out zu erhalten, existiert oder "in" -Prüfungen reibungsloser mit den anderen Python-Tools laufen. Ich dachte nur, ich würde das für die Leute da draußen werfen.

Hesekiel Kruglick
quelle
aber AttributeError: 'DataFrame'-Objekt hat kein Attribut' Feld '
Gank
1
Hallo Gank. Das "Feld" sollte zeigen, dass Sie die Methode ".values" auf verschiedene Felder des Datenrahmens anwenden können, z. B. Spalten oder eine ausgewählte Spalte. ".index" ist ein Beispiel für das Ersetzen von "Feld" durch ein tatsächlich verfügbares Feld :) Ich denke, das könnte klarer sein ...
Ezekiel Kruglick
2
Dies war sehr hilfreich, um darauf hinzuweisen. Ich habe einen hierarchischen Fall, in dem in g in df.indexwahr und in g in df.index.valuesfalsch erzeugt wird. Interessant.
Watsonic
@watsonic - Ein Warnhinweis ist, ob eines davon aufgrund der Hierarchie Tupel zurückgibt. Stellen Sie sicher, dass Sie sich ansehen, was beide ausgeben (z. B. in Ipython oder in der Befehlszeile), um sicherzustellen, dass Sie verstehen, womit Sie vergleichen. Eine andere Sache, die Sie mit hierarchischen Indizes tun können, ist df.index.get_level_values ​​(<Ebenenname>), um die Dinge verständlicher zu machen - natürlich abhängig von Ihrer Anwendung.
Ezekiel Kruglick
28

Der Multi-Index unterscheidet sich ein wenig vom Single-Index. Hier sind einige Methoden für mehrfach indizierte Datenrahmen.

df = pd.DataFrame({'col1': ['a', 'b','c', 'd'], 'col2': ['X','X','Y', 'Y'], 'col3': [1, 2, 3, 4]}, columns=['col1', 'col2', 'col3'])
df = df.set_index(['col1', 'col2'])

in df.index funktioniert nur für die erste Ebene, wenn ein einzelner Indexwert überprüft wird.

'a' in df.index     # True
'X' in df.index     # False

Suchen Sie df.index.levelsnach anderen Ebenen.

'a' in df.index.levels[0] # True
'X' in df.index.levels[1] # True

Suchen Sie df.indexnach einem Indexkombinationstupel.

('a', 'X') in df.index  # True
('a', 'Y') in df.index  # False
Broccoli2000
quelle
2

mit DataFrame: df_data

>>> df_data
  id   name  value
0  a  ampha      1
1  b   beta      2
2  c     ce      3

Ich habe es versucht:

>>> getattr(df_data, 'value').isin([1]).any()
True
>>> getattr(df_data, 'value').isin(['1']).any()
True

aber:

>>> 1 in getattr(df_data, 'value')
True
>>> '1' in getattr(df_data, 'value')
False

So viel Spaß: D.

Quoc Chi
quelle
isinwird nicht nach dem dtype suchen. df['value'].isin([True]).any()Versuchen Sie dies, es gibt Ihnen auch True, weil es mit übereinstimmt 1. True -> 1.
Mohamed Thasin ah
1
df = pandas.DataFrame({'g':[1]}, index=['isStop'])

#df.loc['g']

if 'g' in df.index:
    print("find g")

if 'isStop' in df.index:
    print("find a") 
Gank
quelle
Was ist isStop?
Nabin
1

Der folgende Code gibt keinen Booleschen Wert aus, ermöglicht jedoch die Teilmenge von Datenrahmen nach Index ... Ich verstehe, dass dies wahrscheinlich nicht die effizienteste Methode zur Lösung des Problems ist, aber ich mag (1) die Art und Weise, wie dies gelesen wird, und (2) Sie können leicht Teilmengen erstellen wobei der df1-Index in df2 existiert:

df3 = df1[df1.index.isin(df2.index)]

oder wo df1 index in df2 nicht existiert ...

df3 = df1[~df1.index.isin(df2.index)]
xxyjoel
quelle