Eu sei que esta é uma pergunta muito básica, mas por algum motivo não consigo encontrar uma resposta. Como posso obter o índice de determinado elemento de uma série em pandas python? (a primeira ocorrência seria suficiente)
Ou seja, eu gostaria de 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
Certamente, é possível definir esse método com um loop:
def find(s, el):
for i in s.index:
if s[i] == el:
return i
return None
print find(myseries, 7)
mas suponho que deveria haver uma maneira melhor. Existe?
Convertendo para um índice, você pode usar
get_loc
Manuseio duplicado
Retornará uma matriz booleana se retornos não contíguos
Usa uma hashtable internamente, tão rápido
Como Viktor aponta, há uma sobrecarga de criação única para a criação de um índice (isso ocorre quando você realmente faz algo com o índice, por exemplo, o
is_unique
)fonte
s.index[_]
Isso funciona se você souber que 7 existe com antecedência. Você pode verificar isso com (myseries == 7) .any ()
Outra abordagem (muito semelhante à primeira resposta) que também é responsável por vários 7's (ou nenhum) é
fonte
any
verificação não é ideal, pois é necessária uma iteração dupla. Há uma verificação pós-operatória interessante que revelará todas asFalse
condições que você pode ver aqui .argmax
ainda retornará 0 (em vez de errar).Estou impressionado com todas as respostas aqui. Esta não é uma resposta nova, apenas uma tentativa de resumir os tempos de todos esses métodos. Eu considerei o caso de uma série com 25 elementos e assumi o caso geral em que o índice poderia conter quaisquer valores e você deseja que o valor do índice corresponda ao valor de pesquisa que está no final da série.
Aqui estão os testes de velocidade em um MacBook Pro 2013 em Python 3.7 com Pandas versão 0.25.3.
A resposta de @ Jeff parece ser a mais rápida - embora não lide com duplicatas.
Correção : desculpe, perdi uma, a solução do @Alex Spangher usando o método de índice de lista é de longe o mais rápido.
Atualização : adicionada a resposta de @ EliadL.
Espero que isto ajude.
É surpreendente que uma operação tão simples exija soluções complicadas e muitas sejam muito lentas. Mais de meio milissegundo, em alguns casos, para encontrar um valor em uma série de 25.
fonte
myindex
criado, pois ele precisa ser criado apenas uma vez?myindex
série se você for fazer a pesquisa várias vezes. Para este teste, presumi que era necessário apenas uma vez e que o tempo total de execução era importante.pd.Index(myseries)
. Para ser justo com os outros métodos, presumi que a série original poderia ter sido alterada desde a última pesquisa.Outra maneira de fazer isso, embora igualmente insatisfatória é:
retornos: 3
Em testes de tempo usando um conjunto de dados atual com o qual estou trabalhando (considere aleatório):
fonte
Se você usar numpy, poderá obter uma matriz das indecies encontradas em seu valor:
Isso retorna uma tupla de um elemento que contém uma matriz de indecies, em que 7 é o valor em myseries:
fonte
você pode usar Series.idxmax ()
fonte
index of certain element
como a pergunta.Outra maneira de fazer isso que ainda não foi mencionado é o método tolist:
deve retornar o índice correto, assumindo que o valor exista na série.
fonte
Geralmente, seu valor ocorre em vários índices:
fonte
Esta é a abordagem mais nativa e escalável que eu poderia encontrar:
fonte