¿Por qué los pandas convierten int sin signo mayor que 2 ** 63-1 en objetos?

Cuando convierto una matriz numpy en un dataframe pandas, los pandas cambian los tipos uint64 a tipos de objetos si el número entero es mayor que 2 ^ 63 – 1.

import pandas as pd import numpy as np x = np.array([('foo', 2 ** 63)], dtype = np.dtype([('string', np.str_, 3), ('unsigned', np.uint64)])) y = np.array([('foo', 2 ** 63 - 1)], dtype = np.dtype([('string', np.str_, 3), ('unsigned', np.uint64)])) print pd.DataFrame(x).dtypes.unsigned dtype('O') print pd.DataFrame(y).dtypes.unsigned dtype('uint64') 

Esto es molesto porque no puedo escribir el dataframe en un archivo hdf en el formato de tabla:

 pd.DataFrame(x).to_hdf('x.hdf', 'key', format = 'table') 

Ouput:

TypeError: no se puede serializar la columna [unsigned] porque su contenido de datos es dtype [integer] object

¿Alguien puede explicar la conversión de tipo?

Es un error abierto , pero puede forzarlo de nuevo a un uint64 usando DataFrame.astype()

 x = np.array([('foo', 2 ** 63)], dtype = np.dtype([('string', np.str_, 3), ('unsigned', np.uint64)])) a = pd.DataFrame(x) a['unsigned'] = a['unsigned'].astype(np.uint64) >>>a.dtypes string object unsigned uint64 dtype: object 

Otros métodos utilizados para convertir tipos de datos a valores numéricos provocaron errores o no funcionaron:

 >>>pd.to_numeric(a['unsigned'], errors = coerce) OverflowError: Python int too large to convert to C long >>>a.convert_objects(convert_numeric = True).dtypes string object unsigned object dtype: object 
 x = np.array([('foo', 2 ** 63)], dtype = np.dtype([('string', np.str_, 3), ('unsigned', 'f4')])) y = np.array([('foo', 2 ** 63 - 1)], dtype = np.dtype([('string', np.str_, 3), ('unsigned', 'i8')]))