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.

27
demandé sur piripiri 2018-06-04 18:15:03

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.

28
répondu coldspeed 2018-06-04 15:17:14

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.’

15
répondu EdChum 2018-06-04 15:22:47

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)
5
répondu MaxU 2018-06-04 16:12:31

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')

2
répondu Acccumulation 2018-06-04 18:55:07