Quero encontrar linhas que contenham uma string, assim:
DF[DF.col.str.contains("foo")]
No entanto, isso falha porque alguns elementos são NaN:
ValueError: não é possível indexar com vetor contendo valores NA / NaN
Então eu recorro ao ofuscado
DF[DF.col.notnull()][DF.col.dropna().str.contains("foo")]
Existe uma maneira melhor?
a
foi preenchido a partir de um CSV, e aa
coluna continha a string "nan".pandas
"inteligentemente" converti isso paraNaN
e comecei a reclamar quando tentei fazerdf.a.str.contains()
. Então, sim, protop: certifique-se de definir o tipo de coluna emread_csv()
ou depois faça algo comodf = df.where(pandas.notnull(df), "nan")
LOLdf.loc
e não apenasdf
?Além das respostas acima, eu diria que, para colunas sem um único nome de palavra, você pode usar: -
Espero que isto ajude.
fonte
Não estou 100% esclarecido por que (na verdade, vim aqui para pesquisar a resposta), mas isso também funciona e não requer a substituição de todos os valores nan.
Funciona com ou sem
.loc
.Não tenho ideia de por que isso funciona, pois entendo que, quando você indexa com colchetes, o pandas avalia o que quer que esteja dentro do colchete como
True
ouFalse
. Eu não posso dizer por que tornar a frase dentro dos colchetes 'booleano extra' tem algum efeito.fonte
Você também pode padronizar:
fonte
fonte