J'ai un fichier csv avec une colonne avec des chaînes et je veux le lire avec des pandas. Dans ce fichier, la chaîne null
apparaît comme une valeur réelle et ne doit pas être considérée comme une valeur manquante.
Exemple:
import pandas as pd
from io import StringIO
data = u'strings,numbers\nfoo,1\nbar,2\nnull,3'
print(pd.read_csv(StringIO(data)))
Cela donne la sortie suivante:
strings numbers
0 foo 1
1 bar 2
2 NaN 3
Que puis-je faire pour obtenir la valeur null
telle qu'elle est (et non pas comme NaN) dans le DataFrame? On peut supposer que le fichier ne contient aucune valeur réellement manquante.
Vous pouvez spécifier un argument converters
pour la colonne string
.
pd.read_csv(StringIO(data), converters={'strings' : str})
strings numbers
0 foo 1
1 bar 2
2 null 3
Cela contournera l'analyse automatique des pandas.
Une autre option consiste à définir na_filter=False
:
pd.read_csv(StringIO(data), na_filter=False)
strings numbers
0 foo 1
1 bar 2
2 null 3
Cela fonctionne pour l'ensemble du DataFrame, donc utilisez-le avec prudence. Je recommande la première option si vous souhaitez l'appliquer chirurgicalement pour sélectionner des colonnes à la place.
La raison pour laquelle cela se produit est que la chaîne 'null'
est traité comme NaN
lors de l'analyse, vous pouvez le désactiver en passant keep_default_na=False
en plus de la réponse de @ coldspeed:
In[49]:
data = u'strings,numbers\nfoo,1\nbar,2\nnull,3'
df = pd.read_csv(io.StringIO(data), keep_default_na=False)
df
Out[49]:
strings numbers
0 foo 1
1 bar 2
2 null 3
La liste complète est:
na_values: scalaire, str, semblable à une liste ou dict, par défaut Aucun
Chaînes supplémentaires à reconnaître comme NA/NaN. Si dict réussit, des valeurs NA spécifiques par colonne. Par défaut, les valeurs suivantes sont interprétées comme NaN: '', '# N/A', '# N/AN/A', '#NA', '-1. # IND', '-1. # QNAN', "-NaN", "-nan", "1. # IND", "1. # QNAN", "N/A", "NA", "NULL", "NaN", "n/a", "nan ', 'nul'.
nous pouvons exclure dynamiquement 'NULL'
et 'null'
de l'ensemble par défaut _NA_VALUES
:
In [4]: na_vals = pd.io.common._NA_VALUES.difference({'NULL','null'})
In [5]: na_vals
Out[5]:
{'',
'#N/A',
'#N/A N/A',
'#NA',
'-1.#IND',
'-1.#QNAN',
'-NaN',
'-nan',
'1.#IND',
'1.#QNAN',
'N/A',
'NA',
'NaN',
'n/a',
'nan'}
et utilisez-le dans read_csv()
:
df = pd.read_csv(io.StringIO(data), na_values=na_vals)
D'autres réponses sont meilleures pour lire dans un csv sans que "null" soit interprété comme Nan
, mais si vous avez une trame de données que vous voulez "fixe", ce code le fera: df=df.fillna('null')