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'']