Comment traiter NULL comme une chaîne normale avec pandas?
j'ai un fichier csv avec une colonne avec des cordes et je veux le lire avec les pandas. Dans ce fichier, la chaîne null
se produit 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,numbersnfoo,1nbar,2nnull,3'
print(pd.read_csv(StringIO(data)))
donne la sortie suivante:
strings numbers
0 foo 1
1 bar 2
2 NaN 3
Que puis-je faire pour obtenir la valeur null
comme il est (et pas comme NaN) dans le DataFrame? On peut supposer que le fichier ne contient pas de valeurs manquantes.
4 réponses
Vous pouvez spécifier un converters
argument string
colonne.
pd.read_csv(StringIO(data), converters={'strings' : str})
strings numbers
0 foo 1
1 bar 2
2 null 3
ceci contournera l'analyse automatique de pandas.
une autre option est 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 avec prudence. Je recommande la première option si vous voulez appliquer chirurgicalement ceci pour choisir des colonnes à la place.
La raison à cela est que la chaîne 'null'
est traitée comme NaN
sur l'analyse, vous pouvez désactiver cette fonction 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, sous forme de liste, ou dict, par défaut None
chaînes supplémentaires à reconnaître comme NA / NaN. Si dict passé, spécifique valeurs de NA par colonne. Par défaut, les valeurs suivantes sont interprétées as NaN:", '#N / A', ' #N / A N / A’, ‘#N’, ‘-1.# IND’, ' -1.# QNAN’, ' - NaN’, "- nan’, " 1.# IND’, ' 1.#QNAN’, ‘N / a',’ NA‘,’ NULL', 'NaN’, ' n / a', ' nan’, ‘NULL.’
on peut dynamiquement exclure 'NULL'
et 'null'
à partir de l'ensemble de 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 l'utiliser 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 "null" étant interprété comme Nan
, mais si vous avez un dataframe que vous voulez "fixe", ce code: df=df.fillna('null')