J'ai lu les données d'un fichier .csv dans une trame de données Pandas comme ci-dessous. Pour l'une des colonnes, à savoir id
, je veux spécifier le type de colonne comme int
. Le problème est que la id
série a des valeurs manquantes / vides.
Lorsque j'essaie de convertir la id
colonne en entier lors de la lecture du .csv, j'obtiens:
df= pd.read_csv("data.csv", dtype={'id': int})
error: Integer column has NA values
Alternativement, j'ai essayé de convertir le type de colonne après avoir lu comme ci-dessous, mais cette fois j'obtiens:
df= pd.read_csv("data.csv")
df[['id']] = df[['id']].astype(int)
error: Cannot convert NA to integer
Comment puis-je résoudre ce problème?
Réponses:
Le manque de représentant NaN dans les colonnes entières est un "gotcha" pandas .
La solution de contournement habituelle consiste simplement à utiliser des flottants.
la source
df = df.astype(pd.Int32Dtype())
(pour convertir la totalité du dataFrame, ou)df['col'] = df['col'].astype(pd.Int32Dtype())
. Les autres types d'entiers nullables acceptés sontpd.Int16Dtype
etpd.Int64Dtype
. Choisissez votre poison.Dans la version 0.24. + Pandas a acquis la possibilité de contenir des dtypes entiers avec des valeurs manquantes.
Type de données Nullable Integer .
Les pandas peuvent représenter des données entières avec des valeurs éventuellement manquantes en utilisant
arrays.IntegerArray
. Il s'agit d'une extension de types implémentée dans les pandas. Ce n'est pas le dtype par défaut pour les entiers et ne sera pas déduit; vous devez explicitement passer le dtype dansarray()
ouSeries
:Pour convertir la colonne en entiers Nullable, utilisez:
la source
"Int64"
et non"int64"
(le premier «i» doit être en majuscule)df.myCol = df.myCol.astype('Int64')
oudf['myCol'] = df['myCol'].astype('Int64')
Mon cas d'utilisation est la fusion des données avant de les charger dans une table DB:
Supprimez les NaN, convertissez en int, convertissez en str, puis réinsérez les NAN.
Ce n'est pas joli mais ça fait le boulot!
la source
Il est désormais possible de créer une colonne pandas contenant NaNs comme dtype
int
, puisqu'elle est désormais officiellement ajoutée sur pandas 0.24.0notes de publication de pandas 0.24.x Citation: " Pandas a acquis la possibilité de contenir des dtypes entiers avec des valeurs manquantes
la source
Si vous souhaitez absolument combiner des entiers et des NaN dans une colonne, vous pouvez utiliser le type de données 'objet':
Cela remplacera NaNs par un entier (peu importe lequel), convertira en int, convertira en objet et enfin réinsérera NaNs.
la source
Si vous pouvez modifier vos données stockées, utilisez une valeur sentinelle pour les données manquantes
id
. Un cas d'utilisation courant, inféré par le nom de la colonne, étantid
un entier, strictement supérieur à zéro, vous pouvez l'utiliser0
comme valeur sentinelle afin de pouvoir écrirela source
Vous pouvez utiliser
.dropna()
si c'est OK pour supprimer les lignes avec les valeurs NaN.Vous pouvez également utiliser
.fillna()
et.astype()
pour remplacer le NaN par des valeurs et les convertir en int.J'ai rencontré ce problème lors du traitement d'un fichier CSV avec de grands entiers, alors que certains d'entre eux manquaient (NaN). Utiliser float comme type n'était pas une option, car je risquais de perdre la précision.
Ma solution était d' utiliser str comme type intermédiaire . Ensuite, vous pouvez convertir la chaîne en int comme vous le souhaitez plus tard dans le code. J'ai remplacé NaN par 0, mais vous pouvez choisir n'importe quelle valeur.
Pour l'illustration, voici un exemple de la façon dont les flotteurs peuvent perdre la précision:
Et le résultat est:
la source
La plupart des solutions présentées ici vous indiquent comment utiliser un entier d'espace réservé pour représenter des valeurs nulles. Cette approche n'est pas utile si vous n'êtes pas sûr que l'entier n'apparaîtra pas dans vos données source. Ma méthode avec formatera les flottants sans leurs valeurs décimales et convertira les valeurs nulles en None. Le résultat est un type de données d'objet qui ressemblera à un champ entier avec des valeurs nulles lorsqu'il est chargé dans un CSV.
la source
J'ai rencontré ce problème en travaillant avec pyspark. Comme il s'agit d'un frontend python pour le code exécuté sur un jvm, il nécessite la sécurité de type et l'utilisation de float au lieu de int n'est pas une option. J'ai contourné le problème en enveloppant les pandas
pd.read_csv
dans une fonction qui remplira les colonnes définies par l'utilisateur avec des valeurs de remplissage définies par l'utilisateur avant de les convertir au type requis. Voici ce que j'ai fini par utiliser:la source
la source
edit
ajouter des informations supplémentaires et / ou compléter vos explications avec la documentation source.Supprimez d'abord les lignes contenant NaN. Ensuite, effectuez une conversion entière sur les lignes restantes. Enfin, insérez à nouveau les lignes supprimées. J'espère que ça fonctionnera
la source
En supposant que votre DateColumn formatée 3312018.0 doit être convertie en 31/03/2018 sous forme de chaîne. Et, certains enregistrements sont manquants ou 0.
la source