web-dev-qa-db-fra.com

Comment traiter NULL comme une chaîne normale avec des pandas?

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.

28
piripiri

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.

29
cs95

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

15
EdChum

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)
5
MaxU

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

2
Acccumulation