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)
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)
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 NaN
s:
_df['x'] = pd.to_numeric(df['x'], errors='coerce')
_
Et pour supprimer toutes les lignes avec NaN
s dans la colonne x
use dropna
:
_df = df.dropna(subset=['x'])
_
Dernière conversion des valeurs en int
s:
_df['x'] = df['x'].astype(int)
_
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)
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
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.