Obtenez pandas.read_csv pour lire les valeurs vides sous forme de chaîne vide au lieu de nan

95

J'utilise la bibliothèque pandas pour lire certaines données CSV. Dans mes données, certaines colonnes contiennent des chaînes. La chaîne "nan"est une valeur possible, tout comme une chaîne vide. J'ai réussi à amener les pandas à lire "nan" comme une chaîne, mais je ne peux pas comprendre comment l'obtenir pour ne pas lire une valeur vide comme NaN. Voici des exemples de données et de sortie

One,Two,Three
a,1,one
b,2,two
,3,three
d,4,nan
e,5,five
nan,6,
g,7,seven

>>> pandas.read_csv('test.csv', na_values={'One': [], "Three": []})
    One  Two  Three
0    a    1    one
1    b    2    two
2  NaN    3  three
3    d    4    nan
4    e    5   five
5  nan    6    NaN
6    g    7  seven

Il lit correctement "nan" comme la chaîne "nan ', mais lit toujours les cellules vides comme NaN. J'ai essayé de passer strl' convertersargument à read_csv (avec converters={'One': str})), mais il lit toujours les cellules vides comme NaN.

Je me rends compte que je peux remplir les valeurs après lecture, avec fillna, mais n'y a-t-il vraiment aucun moyen de dire aux pandas qu'une cellule vide dans une colonne CSV particulière doit être lue comme une chaîne vide au lieu de NaN?

BrenBarn
la source
Notez la réponse la plus simple en utilisant l'option la plus récente keep_default_naci-dessous.
nealmcb

Réponses:

55

J'ai ajouté un ticket pour ajouter une option quelconque ici:

https://github.com/pydata/pandas/issues/1450

En attendant, result.fillna('')tu devrais faire ce que tu veux

EDIT: dans la version de développement (pour être 0.8.0 final) si vous spécifiez une liste vide de na_values, les chaînes vides resteront des chaînes vides dans le résultat

Wes McKinney
la source
11
Documentation pour DataFrame.fillna. Essayez result.fillna('', inplace=True). Sinon, il crée une copie du dataframe.
Sergey Orshanskiy
1
désolé de ressusciter une si vieille réponse, mais cela est-il déjà arrivé? Autant que je sache d'après ce PR GitHub, il a été fermé sans jamais être fusionné, et je ne vois pas le comportement demandé dans pandas version 0.14.x
drammock
9
La documentation de read_csv propose désormais à la fois na_values(list ou dict indexé par colonnes) et keep_default_na(bool). La keep_default_navaleur indique si les valeurs NA par défaut des pandas doivent être remplacées ou ajoutées. Le code de l'OP ne fonctionne pas actuellement simplement parce qu'il manque cet indicateur. Pour cet exemple, vous pouvez utiliser pandas.read_csv('test.csv',na_values=['nan'], keep_default_na=False).
Michael Delgado
@delgadom Merci de m'avoir conduit keep_default_na. Mais notez qu'il ne veut pas non plus que «nan» soit traité par défaut. J'ai ajouté une explication plus complète en tant que nouvelle réponse.
nealmcb
a rencontré à nouveau cela. le correctif est facile (la meilleure réponse est comme ci-dessous de mettrekeep_default_na=False ) mais le comportement par défaut des pandas à ce sujet est mauvais pour l'OMI. si, pour une raison quelconque, pandas read_csv déduit qu'une colonne n'est pas numérique, il ne devrait pas changer automatiquement les chaînes vides en NaN.
pietroppeter
108

J'étais toujours confus après avoir lu les autres réponses et commentaires. Mais la réponse semble maintenant plus simple, alors allez-y.

Depuis la version 0.9 de Pandas (à partir de 2012), vous pouvez lire votre csv avec des cellules vides interprétées comme des chaînes vides en définissant simplement keep_default_na=False:

pd.read_csv('test.csv', keep_default_na=False)

Ce problème est expliqué plus clairement dans

Cela a été corrigé le 19 août 2012 pour Pandas version 0.9 dans

nealmcb
la source
5
C'est clairement la meilleure réponse, elle doit être désignée comme première solution. Merci @nealmcb
dzof31
3
Pourquoi n'est-ce pas une réponse plus populaire? Je recherche cette solution depuis hier. Merci!
anish
7

Nous avons un argument simple dans Pandas read_csv pour cela:

Utilisation:

df = pd.read_csv('test.csv', na_filter= False)

La documentation Pandas explique clairement comment fonctionne l'argument ci-dessus.

Lien

Sundeep
la source
On dirait que l'OP ne veulent utiliser na_valuespour reconnaître « nan », mais tournantna_filter hors serait tout à vaincre cela. Ainsi ma réponse avec keep_default_na=False.
nealmcb