web-dev-qa-db-fra.com

Quelle est la différence entre dtype et convertisseurs dans pandas.read_csv?

la fonction pandas read_csv () lit un fichier .csv. Sa documentation est ici

Selon la documentation, nous savons:

dtype: Saisissez le nom ou le dict de la colonne -> type, par défaut Aucun Type de données pour les données ou les colonnes. Par exemple. {‘A’: np.float64, ‘b’: np.int32} (non pris en charge avec engine = ’python’)

et

convertisseurs: dict, par défaut Aucun Dict des fonctions de conversion des valeurs dans certaines colonnes. Les clés peuvent être des entiers ou des étiquettes de colonne

Lorsque j'utilise cette fonction, je peux appeler pandas.read_csv('file',dtype=object) ou pandas.read_csv('file',converters=object). Évidemment, convertisseur, son nom peut dire que le type de données sera converti mais je me demande le cas de dtype?

16
Bryan

La différence sémantique est que dtype vous permet de spécifier comment traiter les valeurs, par exemple, sous forme numérique ou de type chaîne.

Les convertisseurs vous permettent d'analyser vos données d'entrée pour les convertir en un dtype souhaité à l'aide d'une fonction de conversion, par exemple, en analysant une valeur de chaîne en datetime ou en un autre dtype souhaité.

Ici, nous voyons que pandas essaie de flairer les types:

In [2]:
df = pd.read_csv(io.StringIO(t))
t="""int,float,date,str
001,3.31,2015/01/01,005"""
df = pd.read_csv(io.StringIO(t))
df.info()

<class 'pandas.core.frame.DataFrame'>
Int64Index: 1 entries, 0 to 0
Data columns (total 4 columns):
int      1 non-null int64
float    1 non-null float64
date     1 non-null object
str      1 non-null int64
dtypes: float64(1), int64(2), object(1)
memory usage: 40.0+ bytes

Vous pouvez voir ci-dessus que 001 et 005 sont traités comme int64 mais la chaîne de date reste str.

Si nous disons que tout est object, alors essentiellement tout est str:

In [3]:    
df = pd.read_csv(io.StringIO(t), dtype=object).info()

<class 'pandas.core.frame.DataFrame'>
Int64Index: 1 entries, 0 to 0
Data columns (total 4 columns):
int      1 non-null object
float    1 non-null object
date     1 non-null object
str      1 non-null object
dtypes: object(4)
memory usage: 40.0+ bytes

Ici, nous forçons la colonne int à str et disons à parse_dates pour utiliser le date_parser pour analyser la colonne de date:

In [6]:
pd.read_csv(io.StringIO(t), dtype={'int':'object'}, parse_dates=['date']).info()

<class 'pandas.core.frame.DataFrame'>
Int64Index: 1 entries, 0 to 0
Data columns (total 4 columns):
int      1 non-null object
float    1 non-null float64
date     1 non-null datetime64[ns]
str      1 non-null int64
dtypes: datetime64[ns](1), float64(1), int64(1), object(1)
memory usage: 40.0+ bytes

De même, nous aurions pu passer le to_datetime fonction pour convertir les dates:

In [5]:
pd.read_csv(io.StringIO(t), converters={'date':pd.to_datetime}).info()

<class 'pandas.core.frame.DataFrame'>
Int64Index: 1 entries, 0 to 0
Data columns (total 4 columns):
int      1 non-null int64
float    1 non-null float64
date     1 non-null datetime64[ns]
str      1 non-null int64
dtypes: datetime64[ns](1), float64(1), int64(2)
memory usage: 40.0 bytes
17
EdChum