Siéntete en la libertad de divulgar nuestro espacio y códigos con tus amigos, necesitamos tu ayuda para hacer crecer esta comunidad.
Solución:
Puede convertir la mayoría de las columnas simplemente llamando convert_objects
:
In [36]:
df = df.convert_objects(convert_numeric=True)
df.dtypes
Out[36]:
Date object
WD int64
Manpower float64
2nd object
CTR object
2ndU float64
T1 int64
T2 int64
T3 int64
T4 float64
dtype: object
Para la columna ‘2nd’ y ‘CTR’ podemos llamar al vectorizado str
métodos para reemplazar el separador de miles y eliminar el signo ‘%’ y luego astype
para convertir:
In [39]:
df['2nd'] = df['2nd'].str.replace(',','').astype(int)
df['CTR'] = df['CTR'].str.replace('%','').astype(np.float64)
df.dtypes
Out[39]:
Date object
WD int64
Manpower float64
2nd int32
CTR float64
2ndU float64
T1 int64
T2 int64
T3 int64
T4 object
dtype: object
In [40]:
df.head()
Out[40]:
Date WD Manpower 2nd CTR 2ndU T1 T2 T3 T4
0 2013/4/6 6 NaN 2645 5.27 0.29 407 533 454 368
1 2013/4/7 7 NaN 2118 5.89 0.31 257 659 583 369
2 2013/4/13 6 NaN 2470 5.38 0.29 354 531 473 383
3 2013/4/14 7 NaN 2033 6.77 0.37 396 748 681 458
4 2013/4/20 6 NaN 2690 5.38 0.29 361 528 541 381
O puedes hacer el string manejar las operaciones anteriores sin la llamada a astype
y luego llamar convert_objects
para convertir todo de una vez.
ACTUALIZAR
Desde la versión 0.17.0
convert_objects
está en desuso y no hay una función de nivel superior para hacer esto, por lo que debe hacer:
df.apply(lambda col:pd.to_numeric(col, errors='coerce'))
Consulte los documentos y esta pregunta relacionada: pandas: to_numeric para varias columnas
convert_objects está en desuso.
Para pandas >= 0.17.0, use pd.to_numeric
df["2nd"] = pd.to_numeric(df["2nd"])
Tuve este problema en un DataFrame (df
) creado a partir de una hoja de Excel con varias filas de encabezado interno.
Después de limpiar las filas del encabezado interno de df
los valores de las columnas eran de “nonull tipo de objeto (DataFrame.info()
).
Este código convirtió todos los valores numéricos de múltiples columnas a int64 y float64 de una sola vez:
for i in range(0, len(df.columns)):
df.iloc[:,i] = pd.to_numeric(df.iloc[:,i], errors='ignore')
# errors='ignore' lets strings remain as 'non-null objects'
Te mostramos reseñas y valoraciones
Nos puedes añadir valor a nuestra información añadiendo tu experiencia en las crónicas.