165 votes

Obtenir de pandas.read_csv qu'il lise les valeurs vides comme une chaîne vide au lieu de nan

J'utilise la bibliothèque pandas pour lire des données CSV. Dans mes données, certaines colonnes contiennent des chaînes de caractères. La chaîne "nan" est une valeur possible, tout comme une chaîne vide. J'ai réussi à faire en sorte que pandas lise "nan" comme une chaîne de caractères, mais je n'arrive pas à comprendre comment faire pour qu'il ne lise pas une valeur vide comme NaN. Voici un exemple de données et de résultats

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 le converters à read_csv (avec converters={'One': str}) ), mais il lit toujours les cellules vides comme NaN.

Je sais 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 ?

202voto

nealmcb Points 1223

J'étais encore perplexe après avoir lu les autres réponses et commentaires. Mais la réponse me semble maintenant plus simple, alors voici.

Depuis la version 0.9 de Pandas (depuis 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)

Cette question est expliquée plus clairement dans

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

71voto

Wes McKinney Points 17545

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

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

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

EDIT : dans la version de développement (qui sera 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.

14voto

Sundeep Points 139

Nous avons un argument simple dans Pandas read_csv() pour cela :

Utiliser :

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

9voto

buhtz Points 2072

Ce qu'il faut faire pandas est défini par défaut comme une valeur manquante, tandis que read_csv() est disponible ici.

import pandas
default_missing = pandas._libs.parsers.STR_NA_VALUES
print(default_missing)

La sortie

{'', '<NA>', 'nan', '1.#QNAN', 'NA', 'null', 'n/a', '-nan', '1.#IND', '#N/A N/A', 'N/A', 'NULL', 'NaN', '-1.#IND', '-1.#QNAN', '#NA', '#N/A', '-NaN'}

Il est ainsi possible de procéder à un "opt-out".

import pandas
default_missing = pandas._libs.parsers.STR_NA_VALUES
default_missing = default_missing.remove('')
default_missing = default_missing.remove('na')

with open('test.csv', 'r') as csv_file:
    pandas.read_csv(csv_file, na_values=default_missing)

3voto

ronkov Points 426

Si vous souhaitez conserver les chaînes vides pour une seule colonne, définissez str comme convertisseur de colonnes ( dtypes ne fonctionne pas) :

pd.read_csv('test.csv', converters={'column_name': str})

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X