Encuentra el índice del elemento en la serie pandas.

Resuelto sashkello asked hace 11 años • 12 respuestas

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í?

sashkello avatar Aug 20 '13 12:08 sashkello
Aceptado
>>> 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.

Viktor Kerkez avatar Aug 20 '2013 05:08 Viktor Kerkez

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
Jeff avatar Aug 20 '2013 11:08 Jeff