Ich weiß, dass dies eine sehr grundlegende Frage ist, aber aus irgendeinem Grund kann ich keine Antwort finden. Wie kann ich den Index eines bestimmten Elements einer Serie in Python-Pandas abrufen? (erstes Auftreten würde ausreichen)
Dh ich hätte gerne etwas wie:
import pandas as pd
myseries = pd.Series([1,4,0,7,5], index=[0,1,2,3,4])
print myseries.find(7) # should output 3
Natürlich ist es möglich, eine solche Methode mit einer Schleife zu definieren:
def find(s, el):
for i in s.index:
if s[i] == el:
return i
return None
print find(myseries, 7)
aber ich gehe davon aus, dass es einen besseren Weg geben sollte. Gibt es?
Konvertieren in einen Index können Sie verwenden
get_loc
Doppelte Handhabung
Gibt ein boolesches Array zurück, wenn nicht zusammenhängend zurückgegeben wird
Verwendet intern eine Hashtabelle, so schnell
Wie Viktor darauf hinweist, gibt es eine einmalige Schöpfung Kopf einen Index zu schaffen (das entstehen , wenn Sie tatsächlich etwas mit dem Index DO, zB
is_unique
)quelle
s.index[_]
Dies funktioniert, wenn Sie wissen, dass 7 im Voraus vorhanden ist. Sie können dies mit (myseries == 7) .any () überprüfen
Ein anderer Ansatz (der der ersten Antwort sehr ähnlich ist), der auch mehrere Siebenen (oder keine) berücksichtigt, ist
quelle
any
Prüfung ist jedoch nicht ideal, da eine doppelte Iteration erforderlich ist. Es gibt einen coolen Post-Op-Check, der alleFalse
Bedingungen enthüllt , die Sie hier sehen können .argmax
wird immer noch 0 zurückgegeben (anstatt einen Fehler zu machen).Ich bin beeindruckt von all den Antworten hier. Dies ist keine neue Antwort, sondern nur ein Versuch, die Zeitabläufe all dieser Methoden zusammenzufassen. Ich habe den Fall einer Serie mit 25 Elementen betrachtet und den allgemeinen Fall angenommen, in dem der Index beliebige Werte enthalten könnte und Sie möchten, dass der Indexwert dem Suchwert entspricht, der sich gegen Ende der Serie befindet.
Hier sind die Geschwindigkeitstests auf einem 2013 MacBook Pro in Python 3.7 mit Pandas Version 0.25.3.
@ Jeffs Antwort scheint die schnellste zu sein - obwohl sie keine Duplikate verarbeitet.
Korrektur : Entschuldigung, ich habe eine verpasst. Die Lösung von @Alex Spangher mit der Listenindexmethode ist bei weitem die schnellste.
Update : @ EliadLs Antwort hinzugefügt.
Hoffe das hilft.
Erstaunlich, dass solch eine einfache Operation solch komplizierte Lösungen erfordert und viele so langsam sind. In einigen Fällen über eine halbe Millisekunde, um einen Wert in einer Reihe von 25 zu finden.
quelle
myindex
erstellt wurde, da es nur einmal erstellt werden muss?myindex
Serie zu erstellen , wenn Sie die Suche mehrmals durchführen. Für diesen Test habe ich angenommen, dass er nur einmal benötigt wurde und die gesamte Ausführungszeit wichtig war.pd.Index(myseries)
. Um den anderen Methoden gerecht zu werden, habe ich angenommen, dass sich die Originalserie seit der letzten Suche geändert hat.Ein anderer Weg, dies zu tun, obwohl ebenso unbefriedigend, ist:
Rückgabe: 3
Bei Zeittests mit einem aktuellen Datensatz, mit dem ich arbeite (als zufällig betrachten):
quelle
Wenn Sie numpy verwenden, können Sie ein Array der Unabhängigkeiten abrufen, für die Ihr Wert gefunden wurde:
Dies gibt ein Ein-Element-Tupel zurück, das ein Array der Unabhängigkeiten enthält, wobei 7 der Wert in myseries ist:
quelle
Sie können Series.idxmax () verwenden
quelle
index of certain element
wie die gestellte Frage.Eine andere Möglichkeit, die noch nicht erwähnt wurde, ist die Tolist-Methode:
sollte den richtigen Index zurückgeben, vorausgesetzt, der Wert ist in der Serie vorhanden.
quelle
Oft tritt Ihr Wert bei mehreren Indizes auf:
quelle
Dies ist der native und skalierbarste Ansatz, den ich finden konnte:
quelle