Estou tentando determinar se há uma entrada em uma coluna do Pandas que tenha um valor específico. Eu tentei fazer isso com if x in df['id']
. Eu pensei que isso estava funcionando, exceto quando eu o alimentei com um valor que eu sabia que não estava na coluna 43 in df['id']
que ainda retornava True
. Quando subconjunto um quadro de dados contendo apenas entradas correspondentes ao ID ausente df[df['id'] == 43]
, obviamente não há entradas nele. Como determinar se uma coluna em um quadro de dados do Pandas contém um valor específico e por que meu método atual não funciona? (Para sua informação, eu tenho o mesmo problema quando uso a implementação nesta resposta para uma pergunta semelhante).
156
'a' in s.values
deveria ser mais rápido para séries longas.'a' in s
, os pandas optam por verificar o índice em vez dos valores da série? Nos dicionários, eles checam as chaves, mas uma série de pandas deve se comportar mais como uma lista ou matriz, não?s.values
edf.values
é altamente desaconselhado. Veja isso . Além disso,s.values
é realmente muito mais lento em alguns casos..to_numpy
ou.array
estão disponíveis em uma série, então eu não sou inteiramente certo que alternativa que eles estão defendendo (eu não leio "altamente desencorajada"). Na verdade, eles estão dizendo que .values podem não retornar uma matriz numpy, por exemplo, no caso de uma categoria categórica ... mas tudo bem, poisin
ainda funcionará conforme o esperado (na verdade, mais eficientemente que sua equivalente numpy)Você também pode usar o pandas.Series.isin, embora seja um pouco mais longo que
'a' in s.values
:Mas essa abordagem pode ser mais flexível se você precisar corresponder vários valores de uma vez para um DataFrame (consulte DataFrame.isin )
fonte
s.isin(['a']).any()
o
found.count()
testamento contém o número de correspondênciasE se for 0, significa que a string não foi encontrada na coluna.
fonte
na=False
eregex=False
para o meu caso de uso, conforme explicado aqui: pandas.pydata.org/pandas-docs/stable/reference/api/…Eu fiz alguns testes simples:
Curiosamente, não importa se você consulta 9 ou 999999, parece que leva a mesma quantidade de tempo usando a sintaxe in (deve estar usando a pesquisa binária)
Parece que usar x.values é o mais rápido, mas talvez exista uma maneira mais elegante em pandas?
fonte
Ou use
Series.tolist
ouSeries.any
:Series.tolist
faz uma lista sobre aSeries
, e a outra, estou apenas obtendo um booleanoSeries
de um regular eSeries
, em seguida, verificando se há algumTrue
s no booleanoSeries
.fonte
Condição simples:
fonte
Usar
Se
x
estiver presenteid
, retornará a lista de índices onde estiver presente, caso contrário, fornecerá uma lista vazia.fonte
Não sugiro usar "valor em série", o que pode gerar muitos erros. Consulte esta resposta para obter detalhes: Uso no operador com a série Pandas
fonte
Suponha que seu dataframe se pareça com:
Agora você deseja verificar se o nome do arquivo "80900026941984" está presente no dataframe ou não.
Você pode simplesmente escrever:
fonte