Encuentra el índice del elemento en la serie pandas.
Sé que esta es una pregunta muy básica pero por alguna razón no encuentro una respuesta. ¿Cómo puedo obtener el índice de cierto elemento de una Serie en Python Pandas? (la primera aparición sería suficiente)
Es decir, me gustaría algo como:
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
Ciertamente, es posible definir dicho método con un bucle:
def find(s, el):
for i in s.index:
if s[i] == el:
return i
return None
print find(myseries, 7)
pero supongo que debería haber una manera mejor. ¿Está ahí?
>>> myseries[myseries == 7]
3 7
dtype: int64
>>> myseries[myseries == 7].index[0]
3
Aunque admito que debería haber una mejor manera de hacerlo, al menos esto evita iterar y recorrer el objeto y lo mueve al nivel C.
Al convertir a un índice, puede usarget_loc
In [1]: myseries = pd.Series([1,4,0,7,5], index=[0,1,2,3,4])
In [3]: Index(myseries).get_loc(7)
Out[3]: 3
In [4]: Index(myseries).get_loc(10)
KeyError: 10
Manejo duplicado
In [5]: Index([1,1,2,2,3,4]).get_loc(2)
Out[5]: slice(2, 4, None)
Devolverá una matriz booleana si devuelve no contiguos
In [6]: Index([1,1,2,1,3,2,4]).get_loc(2)
Out[6]: array([False, False, True, False, False, True, False], dtype=bool)
Utiliza una tabla hash internamente, muy rápido
In [7]: s = Series(randint(0,10,10000))
In [9]: %timeit s[s == 5]
1000 loops, best of 3: 203 µs per loop
In [12]: i = Index(s)
In [13]: %timeit i.get_loc(5)
1000 loops, best of 3: 226 µs per loop
Como señala Viktor, existe una sobrecarga de creación única para crear un índice (se incurre cuando realmente HACE algo con el índice, por ejemplo, el is_unique
)
In [2]: s = Series(randint(0,10,10000))
In [3]: %timeit Index(s)
100000 loops, best of 3: 9.6 µs per loop
In [4]: %timeit Index(s).is_unique
10000 loops, best of 3: 140 µs per loop