Quiero establecer la dtype
s de varias columnas en pd.Dataframe
(tengo un archivo que tuve que analizar manualmente en una lista de listas, ya que el archivo no era apto para pd.read_csv
)
import pandas as pd
print pd.DataFrame([['a','1'],['b','2']],
dtype={'x':'object','y':'int'},
columns=['x','y'])
yo obtengo
ValueError: entry not a 2- or 3- tuple
La única forma en que puedo configurarlos es recorriendo cada variable de columna y volviendo a lanzar con astype
.
dtypes = {'x':'object','y':'int'}
mydata = pd.DataFrame([['a','1'],['b','2']],
columns=['x','y'])
for c in mydata.columns:
mydata[c] = mydata[c].astype(dtypes[c])
print mydata['y'].dtype #=> int64
¿Existe una forma mejor?
df = pd.DataFrame([['a','1'],['b','2']], dtype='int', columns=['x','y'])
"funciona" ... pero: sRespuestas:
Desde 0.17, debe usar las conversiones explícitas:
(Como se menciona a continuación, no más "magia",
convert_objects
se ha desaprobado en 0.17)Puede aplicarlos a cada columna que desee convertir:
y confirme que el dtype esté actualizado.
RESPUESTA ANTIGUA / DESAPARECIDA para pandas 0.12 - 0.16: Puede usar
convert_objects
para inferir mejores dtypes:¡Magia! (Es triste verlo obsoleto).
fuente
type.convert
en R un poco; agradable, pero deja a uno deseando especificaciones explícitas en algunos casos.convert_objects()
ha quedado obsoleto ... no estoy seguro de qué lo reemplazó?Para aquellos que vienen de Google (etc.) como yo:
convert_objects
ha quedado obsoleto desde 0.17; si lo usa, recibirá una advertencia como esta:Deberías hacer algo como lo siguiente:
df =
df.astype(np.float)
df["A"] =
pd.to_numeric(df["A"])
fuente
pd.to_datetime, to_timedelta, to_numeric
esto, debería ser la respuesta aceptada.puede establecer los tipos explícitamente con pandas
DataFrame.astype(dtype, copy=True, raise_on_error=True, **kwargs)
y pasar en un diccionario con los dtypes que deseedtype
aquí hay un ejemplo:
ahora puedes ver que ha cambiado
fuente
Otra forma de establecer los tipos de columna es construir primero una matriz de registros numpy con los tipos deseados, completarla y luego pasarla a un constructor de DataFrame.
fuente
enfrenta un problema similar al suyo. En mi caso, tengo miles de archivos de los registros de Cisco que necesito analizar manualmente.
Para ser flexible con los campos y tipos, he probado con éxito utilizando StringIO + read_cvs, que de hecho acepta un dict para la especificación dtype.
Normalmente obtengo cada uno de los archivos (5k-20k líneas) en un búfer y creo los diccionarios dtype de forma dinámica.
Eventualmente concatené (con categórico ... gracias a 0.19) estos marcos de datos en un marco de datos grande que volco en hdf5.
Algo en estas líneas
No es muy pitónico ... pero hace el trabajo
Espero eso ayude.
JC
fuente
Es mejor usar np.arrays escritos y luego pasar los datos y los nombres de las columnas como un diccionario.
fuente