Ich versuche festzustellen, ob es in einer Pandas-Spalte einen Eintrag gibt, der einen bestimmten Wert hat. Ich habe versucht, dies mit zu tun if x in df['id']
. Ich dachte, das funktioniert, außer wenn ich einen Wert eingegeben habe, von dem ich wusste, dass er nicht in der Spalte enthalten ist 43 in df['id']
, die immer noch zurückgegeben wird True
. Wenn ich zu einem Datenrahmen untergebe, der nur Einträge enthält, die mit der fehlenden ID übereinstimmen, df[df['id'] == 43]
sind offensichtlich keine Einträge darin. Wie bestimme ich, ob eine Spalte in einem Pandas-Datenrahmen einen bestimmten Wert enthält und warum funktioniert meine aktuelle Methode nicht? (Zu Ihrer Information, ich habe das gleiche Problem, wenn ich die Implementierung in dieser Antwort auf eine ähnliche Frage verwende).
154
'a' in s.values
sollte für lange Serien schneller sein.'a' in s
Pandas lieber den Index als die Werte der Serie überprüft? In Wörterbüchern überprüfen sie Schlüssel, aber eine Pandas-Serie sollte sich eher wie eine Liste oder ein Array verhalten, oder?s.values
unddf.values
ist stark entstellt. Sehen Sie das . Auchs.values
ist in einigen Fällen tatsächlich viel langsamer..to_numpy
oder.array
in einer Serie verfügbar, daher bin ich mir nicht ganz sicher, welche Alternative sie befürworten (ich lese nicht "sehr entmutigt"). Tatsächlich sagen sie, dass .values möglicherweise kein numpy-Array zurückgeben, z. B. im Fall eines kategorialen ... aber das ist in Ordnung, dain
es immer noch wie erwartet funktioniert (in der Tat effizienter als das Gegenstück zum numpy-Array)Sie können auch pandas.Series.isin verwenden, obwohl es etwas länger ist als
'a' in s.values
:Dieser Ansatz kann jedoch flexibler sein, wenn Sie für einen DataFrame mehrere Werte gleichzeitig abgleichen müssen (siehe DataFrame.isin ).
quelle
s.isin(['a']).any()
Das
found.count()
Testament enthält die Anzahl der ÜbereinstimmungenUnd wenn es 0 ist, bedeutet dies, dass in der Spalte keine Zeichenfolge gefunden wurde.
quelle
na=False
undregex=False
meinen Anwendungsfall einbeziehenIch habe ein paar einfache Tests gemacht:
Interessanterweise spielt es keine Rolle, ob Sie 9 oder 999999 nachschlagen. Es scheint, als würde die Verwendung der In-Syntax ungefähr genauso lange dauern (muss die binäre Suche verwenden).
Die Verwendung von x.values scheint am schnellsten zu sein, aber vielleicht gibt es bei Pandas einen eleganteren Weg?
quelle
Oder verwenden Sie
Series.tolist
oderSeries.any
:Series.tolist
macht eine Liste über aSeries
, und die andere bekomme ich nur einen Booleschen WertSeries
von einem regulärenSeries
und überprüfe dann, ob es irgendwelcheTrue
s im Booleschen Wert gibtSeries
.quelle
Einfacher Zustand:
quelle
Verwenden
Wenn
x
es in vorhandenid
ist, wird die Liste der Indizes zurückgegeben, in denen es vorhanden ist, andernfalls wird eine leere Liste angezeigt.quelle
Ich schlage nicht vor, "Wert in Serie" zu verwenden, was zu vielen Fehlern führen kann. Weitere Informationen finden Sie in dieser Antwort: Verwendung im Operator mit Pandas-Serien
quelle
Angenommen, Ihr Datenrahmen sieht folgendermaßen aus:
Jetzt möchten Sie überprüfen, ob der Dateiname "80900026941984" im Datenrahmen vorhanden ist oder nicht.
Sie können einfach schreiben:
quelle