type example data create python pandas

python - example - select rows dataframe pandas



Encontrar el índice del elemento en pandas Series (7)

Sé que esta es una pregunta muy básica, pero por alguna razón no puedo encontrar una respuesta. ¿Cómo puedo obtener el índice de cierto elemento de una serie en pandas de pitón? (la primera ocurrencia 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 mejor manera. ¿Esta ahí?


Convirtiendo en un índice, puede usar get_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 los retornos 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, tan 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, hay una sobrecarga de creación de una sola vez para crear un índice (se incurre cuando realmente HACES 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


Otra forma de hacerlo, aunque igualmente insatisfactoria es:

s = pd.Series([1,3,0,7,5],index=[0,1,2,3,4]) list(s).index(7)

devoluciones: 3

Pruebas a tiempo usando un conjunto de datos actual con el que estoy trabajando (considéralo aleatorio):

[64]: %timeit pd.Index(article_reference_df.asset_id).get_loc(''100000003003614'') 10000 loops, best of 3: 60.1 µs per loop In [66]: %timeit article_reference_df.asset_id[article_reference_df.asset_id == ''100000003003614''].index[0] 1000 loops, best of 3: 255 µs per loop In [65]: %timeit list(article_reference_df.asset_id).index(''100000003003614'') 100000 loops, best of 3: 14.5 µs per loop


Referencia Viktor Kerkez (20 de agosto de 13 a 5:52) Jonathan Eunice (7 de noviembre de 16 a 14:03)

>>> myseries[myseries == 7] 3 7 dtype: int64 >>> myseries[myseries == 7].index # using index[0] specifies the output of the first occurrence only. Using index without adding the element index will give you indexes all occurrences if the series had more then one 7 there. It still presumes you know which number you are looking for. 3


Si usa numpy, puede obtener una matriz de las indecies en las que se encuentra su valor:

import numpy as np import pandas as pd myseries = pd.Series([1,4,0,7,5], index=[0,1,2,3,4]) np.where(myseries == 7)

Esto devuelve una tupla de un elemento que contiene una matriz de las indecies donde 7 es el valor en myseries:

(array([3], dtype=int64),)


puedes usar Series.idxmax ()

>>> import pandas as pd >>> myseries = pd.Series([1,4,0,7,5], index=[0,1,2,3,4]) >>> myseries.idxmax() 3 >>>


>>> myseries[myseries == 7] 3 7 dtype: int64 >>> myseries[myseries == 7].index[0] 3

Aunque admito que debería haber una mejor manera de hacerlo, pero al menos evita iterar y recorrer el objeto y moverlo al nivel C.


In [92]: (myseries==7).argmax() Out[92]: 3

Esto funciona si sabes que 7 está allí por adelantado. Puedes verificar esto con (myseries == 7) .any ()

Otro enfoque (muy similar a la primera respuesta) que también representa múltiples 7 (o ninguno) es

In [122]: myseries = pd.Series([1,7,0,7,5], index=[''a'',''b'',''c'',''d'',''e'']) In [123]: list(myseries[myseries==7].index) Out[123]: [''b'', ''d'']