J'ai essayé de convertir une colonne du type de données float64
à int64
en utilisant:
df['column name'].astype(int64)
mais j'ai eu une erreur:
NameError: le nom 'int64' n'est pas défini
La colonne contient le nombre de personnes mais a été formatée comme 7500000.0
, aucune idée de la façon dont je peux simplement changer cela float64
en int64
?
Solution pour pandas 0.24 + pour la conversion numérique avec des valeurs manquantes:
df = pd.DataFrame({'column name':[7500000.0,7500000.0, np.nan]})
print (df['column name'])
0 7500000.0
1 7500000.0
2 NaN
Name: column name, dtype: float64
df['column name'] = df['column name'].astype(np.int64)
ValueError: impossible de convertir des valeurs non finies (NA ou inf) en nombres entiers
#http://pandas.pydata.org/pandas-docs/stable/user_guide/integer_na.html
df['column name'] = df['column name'].astype('Int64')
print (df['column name'])
0 7500000
1 7500000
2 NaN
Name: column name, dtype: Int64
Je pense que vous avez besoin de casting à numpy.int64
:
df['column name'].astype(np.int64)
Échantillon:
df = pd.DataFrame({'column name':[7500000.0,7500000.0]})
print (df['column name'])
0 7500000.0
1 7500000.0
Name: column name, dtype: float64
df['column name'] = df['column name'].astype(np.int64)
#same as
#df['column name'] = df['column name'].astype(pd.np.int64)
print (df['column name'])
0 7500000
1 7500000
Name: column name, dtype: int64
Si certains NaN
s dans les colonnes doivent être remplacés par quelques int
(par exemple, 0
) par fillna
, car type
sur NaN
est float
:
df = pd.DataFrame({'column name':[7500000.0,np.nan]})
df['column name'] = df['column name'].fillna(0).astype(np.int64)
print (df['column name'])
0 7500000
1 0
Name: column name, dtype: int64
Vérifiez également documentation - règles de conversion de données manquantes
MODIFIER:
Convertir des valeurs avec NaN
s est un buggy:
df = pd.DataFrame({'column name':[7500000.0,np.nan]})
df['column name'] = df['column name'].values.astype(np.int64)
print (df['column name'])
0 7500000
1 -9223372036854775808
Name: column name, dtype: int64
Vous pouvez avoir besoin de passer la chaîne 'int64'
:
>>> import pandas as pd
>>> df = pd.DataFrame({'a': [1.0, 2.0]}) # some test dataframe
>>> df['a'].astype('int64')
0 1
1 2
Name: a, dtype: int64
Il existe d'autres moyens de spécifier des entiers 64 bits:
>>> df['a'].astype('i8') # integer with 8 bytes (64 bit)
0 1
1 2
Name: a, dtype: int64
>>> import numpy as np
>>> df['a'].astype(np.int64) # native numpy 64 bit integer
0 1
1 2
Name: a, dtype: int64
Ou utiliser np.int64
directement sur votre colonne (mais il retourne un numpy.array
):
>>> np.int64(df['a'])
array([1, 2], dtype=int64)
Cela semble être un petit buggy dans Pandas 0.23.4?
S'il existe des valeurs np.nan, une erreur se produira comme prévu:
df['col'] = df['col'].astype(np.int64)
Mais ne change aucune valeur de float à int comme je l’attendrais si "ignore" est utilisé:
df['col'] = df['col'].astype(np.int64,errors='ignore')
Cela a fonctionné si j'ai d'abord converti np.nan:
df['col'] = df['col'].fillna(0).astype(np.int64)
df['col'] = df['col'].astype(np.int64)
Maintenant, je ne peux pas comprendre comment trouver comment récupérer des valeurs nulles à la place des zéros, car cela reconvertira tout en float:
df['col'] = df['col'].replace(0,np.nan)