web-dev-qa-db-fra.com

Conversion de la colonne float64 en int64 en Pandas

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?

22
MCG Code

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 NaNs 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 NaNs 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
48
jezrael

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)
4
MSeifert

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)
1
sparrow