Wiem, że to bardzo podstawowe pytanie, ale z jakiegoś powodu nie mogę znaleźć odpowiedzi. Jak mogę uzyskać indeks określonego elementu serii w pandach Pythona? (wystarczyłoby pierwsze wystąpienie)
To znaczy, chciałbym coś takiego:
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
Z pewnością można zdefiniować taką metodę za pomocą pętli:
def find(s, el):
for i in s.index:
if s[i] == el:
return i
return None
print find(myseries, 7)
ale zakładam, że powinien być lepszy sposób. Jest tu?
Konwertując na indeks, możesz użyć
get_loc
Zduplikowana obsługa
Zwróci tablicę logiczną, jeśli nieciągłe wyniki
Wykorzystuje wewnętrznie hashtable, więc szybko
Jak wskazuje Viktor, tworzenie indeksu wiąże się z jednorazowym narzutem (powstaje, gdy faktycznie ZROBISZ coś z indeksem, np.
is_unique
)źródło
s.index[_]
Działa to, jeśli wiesz z wyprzedzeniem, że jest tam 7. Możesz to sprawdzić za pomocą (myseries == 7) .any ()
Innym podejściem (bardzo podobnym do pierwszej odpowiedzi), które również uwzględnia wiele siódemek (lub żadnej), jest
źródło
any
sprawdzenia nie jest idealne, ponieważ potrzebna jest podwójna iteracja. Jest fajny test post op, który ujawni wszystkieFalse
warunki, które możesz zobaczyć tutaj .argmax
spełnia tego warunku, nadal zwróci 0 (zamiast błędu).Jestem pod wrażeniem wszystkich odpowiedzi tutaj. To nie jest nowa odpowiedź, tylko próba podsumowania czasów wszystkich tych metod. Rozważyłem przypadek serii z 25 elementami i przyjąłem ogólny przypadek, w którym indeks może zawierać dowolne wartości i chcesz, aby wartość indeksu odpowiadała wartości wyszukiwania, która znajduje się pod koniec serii.
Oto testy szybkości na MacBooku Pro 2013 w Pythonie 3.7 z wersją Pandas 0.25.3.
Odpowiedź @ Jeffa wydaje się być najszybsza - chociaż nie obsługuje duplikatów.
Korekta : Przepraszam, przegapiłem jedno, rozwiązanie @Alex Spangher wykorzystujące metodę indeksu listy jest zdecydowanie najszybsze.
Aktualizacja : Dodano odpowiedź @ EliadL.
Mam nadzieję że to pomoże.
Niesamowite, że tak prosta operacja wymaga tak zawiłych rozwiązań, a wiele z nich jest tak powolnych. W niektórych przypadkach ponad pół milisekundy, aby znaleźć wartość w serii 25.
źródło
myindex
utworzeniu, skoro trzeba go utworzyć tylko raz?myindex
Serię warto utworzyć tylko wtedy, gdy zamierzasz wielokrotnie wyszukiwać. Do tego testu założyłem, że był potrzebny tylko raz, a całkowity czas wykonania był ważny.pd.Index(myseries)
. Aby być uczciwym w stosunku do innych metod, założyłem, że oryginalna seria mogła ulec zmianie od ostatniego wyszukiwania.Innym sposobem, aby to zrobić, choć równie niezadowalającym, jest:
zwraca: 3
Testy na czas przy użyciu aktualnego zbioru danych, z którym pracuję (rozważ to losowo):
źródło
Jeśli używasz numpy, możesz uzyskać tablicę gatunków, w których znajduje się twoja wartość:
Zwraca jednoelementową krotkę zawierającą tablicę indecies, gdzie 7 jest wartością w myseries:
źródło
możesz użyć Series.idxmax ()
źródło
index of certain element
taki jak zadane pytanie.Innym sposobem, aby to zrobić, o którym jeszcze nie wspomniano, jest metoda tolist:
powinien zwrócić poprawny indeks, zakładając, że wartość istnieje w Serii.
źródło
Często twoja wartość występuje przy wielu indeksach:
źródło
To najbardziej natywne i skalowalne podejście, jakie udało mi się znaleźć:
źródło