Je veux trouver des lignes qui contiennent une chaîne, comme ceci:
DF[DF.col.str.contains("foo")]
Cependant, cela échoue car certains éléments sont NaN:
ValueError: impossible d'indexer avec un vecteur contenant des valeurs NA / NaN
Alors je recourt à l'obscurcissement
DF[DF.col.notnull()][DF.col.dropna().str.contains("foo")]
Y a-t-il un meilleur moyen?
a
était rempli à partir d'un CSV, et laa
colonne contenait la chaîne "nan".pandas
"intelligemment" converti cela enNaN
et commencé à me plaindre quand j'ai essayé de le fairedf.a.str.contains()
. Alors oui protip: assurez-vous de définir le type de colonneread_csv()
ou ensuite faites quelque chose commedf = df.where(pandas.notnull(df), "nan")
LOLdf.loc
et pas justedf
?En plus des réponses ci-dessus, je dirais que pour les colonnes n'ayant pas de nom de mot unique, vous pouvez utiliser: -
J'espère que cela t'aides.
la source
Je ne suis pas à 100% sur le pourquoi (en fait je suis venu ici pour chercher la réponse), mais cela fonctionne également et ne nécessite pas de remplacer toutes les valeurs nan.
Fonctionne avec ou sans
.loc
.Je n'ai aucune idée de pourquoi cela fonctionne, si je comprends bien lorsque vous indexez avec des crochets, pandas évalue tout ce qui se trouve à l'intérieur du crochet comme étant soit
True
ouFalse
. Je ne peux pas dire pourquoi faire de la phrase entre crochets «extra booléen» a un effet quelconque.la source
Vous pouvez également paterner:
la source
la source