web-dev-qa-db-fra.com

Pandas: ValueError: impossible de convertir un NaN flottant en entier

Je reçois ValueError: impossible de convertir un nombre entier de NaN en entier pour les éléments suivants:

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 peux pas repérer aucun float NaN dans le fichier, et je ne comprends pas ce que cela signifie cette.
  • Quand je lis la colonne en tant que String, elle a des valeurs telles que -1,0,1, ... 2000, toutes me paraissent très intéressantes.
  • Quand je lis la colonne comme float, alors cela peut être chargé. Ensuite, il affiche les valeurs sous la forme -1.0.0.0, etc., il n’existe toujours pas de NaN-s
  • J'ai essayé avec error_bad_lines = False et le paramètre dtype dans read_csv sans succès. Il annule simplement le chargement avec la même exception.
  • Le fichier n'est pas petit (10 lignes ou plus), il est donc impossible de l'inspecter manuellement. Lorsque j'extrais une petite partie d'en-tête, il n'y a pas d'erreur, mais cela se produit avec le fichier complet. Donc, c'est quelque chose dans le fichier, mais ne peut pas détecter quoi.
  • Logiquement, il ne devrait pas y avoir de valeurs manquantes dans le fichier csv, mais même s'il y avait des déchets, je serais autorisé à ignorer les lignes. Ou du moins les identifier, mais je ne vois pas comment il est possible de parcourir un fichier et de signaler des erreurs de conversion.

Mise à jour: en utilisant les astuces dans les commentaires/réponses, j'ai nettoyé mes données 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)
17
JaakL

Pour identifier les valeurs NaN, utilisez boolean indexing :

_print(df[df['x'].isnull()])
_

Ensuite, pour supprimer toutes les valeurs non numériques, utilisez to_numeric avec parameetr _errors='coerce'_ - il remplace non numérique par NaNs:

_df['x'] = pd.to_numeric(df['x'], errors='coerce')
_

Et pour supprimer toutes les lignes avec NaNs dans la colonne x use dropna :

_df = df.dropna(subset=['x'])
_

Dernière conversion des valeurs en ints:

_df['x'] = df['x'].astype(int)
_
20
jezrael

Je sais que cela a été répondu, mais je voulais fournir une solution alternative à tout le monde à l'avenir:

Vous pouvez utiliser .loc pour sous-définir le cadre de données en ne retenant que les valeurs qui sont notnull(), puis sous-ensemble uniquement la colonne 'x'. Prenez ce même vecteur et apply(int).

Si la colonne x est float:

df.loc[df['x'].notnull(), 'x'] = df.loc[df['x'].notnull(), 'x'].apply(int)
3
Matt W.

ValueError: impossible de convertir le NaN flottant en entier

A partir de la v0.24, vous le pouvez réellement. Pandas introduit types de données entiers nullables qui permet aux entiers de coexister avec des NaN.

Étant donné une série de nombres entiers avec des données manquantes,

s = pd.Series([1.0, 2.0, np.nan, 4.0])
s

0    1.0
1    2.0
2    NaN
3    4.0
dtype: float64

s.dtype
# dtype('float64')

Vous pouvez le convertir en un type int nullable (faites votre choix parmi Int16, Int32 ou Int64) avec,

s2 = s.astype('Int32') # note the 'I' is uppercase
s2

0      1
1      2
2    NaN
3      4
dtype: Int32

s2.dtype
# Int32Dtype()

Votre colonne doit avoir des nombres entiers pour que la distribution se produise. Tout le reste soulèvera un TypeError:

s = pd.Series([1.1, 2.0, np.nan, 4.0])

s.astype('Int32')
# TypeError: cannot safely cast non-equivalent float64 to int32
2
cs95

si vous avez une valeur null, alors, en effectuant une opération mathématique, vous obtiendrez cette erreur pour la résoudre. Utilisez df[~df['x'].isnull()]df[['x']].astype(int) si vous voulez que votre jeu de données ne soit pas modifiable.

0
SATYAJIT MAITRA