web-dev-qa-db-fra.com

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

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 à obtenir pandas pour lire "nan" sous forme de chaîne, mais je n'arrive 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 str dans l'argument converters à 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 pandas qu'une cellule vide dans une colonne CSV particulière doit être lue comme une chaîne vide au lieu de NaN ?

59
BrenBarn

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

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

En attendant, result.fillna('') devrait faire ce que vous voulez

EDIT: dans la version de développement (à ê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

39
Wes McKinney

J'étais encore confus après avoir lu les autres réponses et commentaires. Mais la réponse semble maintenant plus simple, alors c'est parti.

Depuis Pandas version 0.9 (à 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 in

54
nealmcb

Nous avons un argument simple dans Pandas read_csv pour cela:

Utilisation:

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

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

Lien

1
Sundeep