python - float - Pandas: convertir dtype ''objeto'' a int
pandas float to int (3)
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 funcionó para mí en base al comentario de @piRSquared.
Necesitaba convertir primero a una cadena, luego a un entero.
>>> df[''purchase''].astype(str).astype(int)
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)
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 programa, 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 programa.
comenta el éxito si funciona. :)