Pandas: ValueError: impossible de convertir le flotteur NaN en entier
- Je obtenir ValueError: impossible de convertir le flotteur NaN entier pour la suite:
df = pandas.read_csv('zoom11.csv')
df[['x']] = df[['x']].astype(int)
- Le "x" est évidemment une colonne dans le fichier csv, mais je ne peut pas détecter toutes les float NaN dans le fichier, et n'obtiennent pas ce que veut dire par là.
- Quand j'ai lu la colonne en tant que Chaîne de caractères, puis il a des valeurs comme -1,0,1,...2000, l'air très sympa int nombres pour moi.
- Quand j'ai lu la colonne en tant que float, alors ce peut être chargé. Puis il montre des valeurs comme -1.0,0.0, etc, il n'y a toujours pas de n'importe quel NaN-s
- J'ai essayé avec error_bad_lines = False et dtype paramètre dans read_csv en vain. Il a juste annule le chargement avec la même exception.
- Le fichier n'est pas petit (10+ M lignes), donc ne peut pas inspecter manuellement, quand j'ai extrait une petite partie en-tête, puis il n'y a pas d'erreur, mais il arrive avec plein de fichier. C'est donc quelque chose dans le fichier, mais ne peut pas détecter quoi.
- Logiquement le csv ne devrait pas avoir de valeurs manquantes, mais même si il y a des ordures alors je serais ok pour ignorer les lignes. Ou au moins de les identifier, mais je ne vois pas de moyen de parcourir les fichiers et la conversion de rapport d'erreurs.
Mise à jour: en Utilisant les conseils dans les commentaires/réponses que j'ai obtenu mes données nettoyer avec ceci:
# x contained NaN
df = df[~df['x'].isnull()]
# Y contained some other garbage, so null check was not enough
df = df[df['y'].str.isnumeric()]
# final conversion now worked
df[['x']] = df[['x']].astype(int)
df[['y']] = df[['y']].astype(int)
- Essayez de le vérifier par
df[df['x'].isnull()]
- Vous avez besoin de comprendre ce que vous voulez faire avec tout NaNs, et puis le faire.
- merci @jezrael , maintenant df[df['x'].isnull()] n'a identifier une ligne avec "NaN" et j'ai pu l'enlever ! Maintenant, avec un autre domaine similaire - ce qui semble avoir quelques autres ordures qui n'est pas de type int. Est-il générique façon de trouver des lignes qui ne sont pas convertible de donnée de type de données, afin que je puisse les identifier et les ordures de tous?
- Utilisation
pd.to_numeric
avecerrors = coerce
au lieu de astype int alorsfillna
avec tout ce que vous voulez. - Dans v0.24, les pandas introduit Nullable Types d'Entiers qui soutiennent les colonnes de type Entier avec NaNs. Voir cette réponse pour plus d'informations.
Vous devez vous connecter pour publier un commentaire.
Pour identifier
NaN
valeurs utiliserboolean indexation
:Ensuite pour supprimer toutes les valeurs non numériques utilisation
to_numeric
avec parameetrerrors='coerce'
- il remplacer non numérique àNaN
s:Et pour supprimer toutes les lignes avec
NaN
s dans la colonnex
utilisationdropna
:Dernière convertir des valeurs de
int
s:'-1'.isnumeric()
? Pas de problème pour mes données x et y >=0, mais la question plus générale encore, comme je ne le vois pas dans le document officiel.'-1'
comme une chaîne de caractères, ce qui n'est pas un nombreJe sais que cela a été répondu, mais a voulu fournir une solution alternative pour tous ceux qui dans l'avenir:
Vous pouvez utiliser
.loc
au sous-ensemble du dataframe par les seules valeurs qui sontnotnull()
, puis sous-ensemble de la'x'
colonne seulement. Prenez la même vecteur, etapply(int)
à elle.Si la colonne x est float:
De v0.24, vous pouvez réellement. Les Pandas introduit Nullable Types De Données Entier qui permet d'utiliser des entiers de coexister avec des NaNs.
Donné une série de l'ensemble des nombres réels avec des données manquantes,
Vous pouvez convertir en un nullable type int (choisissez l'une des
Int16
,Int32
, ouInt64
) avec,Votre colonne doit avoir des nombres entiers pour la fonte de se produire. Tout le reste sera de soulever une exception TypeError:
si vous avez de la valeur null puis en faisant opération mathématique, vous obtiendrez cette erreur de le résoudre utilisation
df[~df['x'].isnull()]df[['x']].astype(int)
si vous voulez que votre jeu de données pour être immuable.