Pandas: convertir dtype ‘objeto’ a int

He leído una consulta SQL en Pandas y los valores aparecen como dtype ‘objeto’, aunque son cadenas, fechas y enteros. Soy capaz de convertir la fecha ‘objeto’ en un dtype datetime de Pandas, pero recibo un error al intentar convertir la cadena y los enteros.

Aquí hay un ejemplo:

>>> import pandas as pd >>> df = pd.read_sql_query('select * from my_table', conn) >>> df id date purchase 1 abc1 2016-05-22 1 2 abc2 2016-05-29 0 3 abc3 2016-05-22 2 4 abc4 2016-05-22 0 >>> df.dtypes id object date object purchase object dtype: object 

La conversión del df['date'] a una fecha y hora funciona:

 >>> pd.to_datetime(df['date']) 1 2016-05-22 2 2016-05-29 3 2016-05-22 4 2016-05-22 Name: date, dtype: datetime64[ns] 

Pero recibo un error al intentar convertir el df['purchase'] en un entero:

 >>> df['purchase'].astype(int) .... pandas/lib.pyx in pandas.lib.astype_intsafe (pandas/lib.c:16667)() pandas/src/util.pxd in util.set_value_at (pandas/lib.c:67540)() TypeError: long() argument must be a string or a number, not 'java.lang.Long' 

NOTA: Obtengo un error similar cuando probé .astype('float')

Y cuando se intenta convertir a una cadena, nada parece suceder.

 >>> df['id'].apply(str) 1 abc1 2 abc2 3 abc3 4 abc4 Name: id, dtype: object 

Documentar la respuesta que me funcionó en base al comentario de @piRSquared.

Necesitaba convertir primero a una cadena, luego a un entero.

 >>> df['purchase'].astype(str).astype(int) 

Sigue estos pasos:

1. limpie su archivo -> abra su archivo de datos en formato csv y vea que hay “?” En lugar de lugares vacíos y borrarlos todos.

2.baje las filas que contienen valores perdidos, por ejemplo:

 df.dropna(subset=["normalized-losses"], axis = 0 , inplace= True) 

3. use astype ahora para la conversión

 df["normalized-losses"]=df["normalized-losses"].astype(int) 

Nota: Si aún encuentra errores en su progtwig, vuelva a inspeccionar su archivo csv , ábralo en Excel para ver si hay un “?” en la columna requerida, luego elimínelo y guarde el archivo y vuelva atrás y ejecute su progtwig.

comenta el éxito! si funciona. 🙂

Es sencillo

 pd.factorize(df['purchase'])[0] 

Ejemplo:

labels, uniques = pd.factorize(['b', 'b', 'a', 'c', 'b'])

labels array([0, 0, 1, 2, 0])

uniques array(['b', 'a', 'c'], dtype=object)