Convierta cadenas a flotar en todas las columnas de pandas, donde sea posible

He creado un dataframe de pandas a partir de una lista de listas

import pandas as pd df_list = [["a", "1", "2"], ["b", "3", np.nan]] df = pd.DataFrame(df_list, columns = list("ABC")) >>> ABC 0 a 1 2 1 b 3 NaN 

¿Hay alguna forma de convertir todas las columnas del dataframe a flotar, que se puedan convertir, es decir, B y C? Los siguientes trabajos, si saben, qué columnas convertir:

  df[["B", "C"]] = df[["B", "C"]].astype("float") 

Pero, ¿qué hace, si no sabe de antemano, qué columnas contienen los números? Cuando lo intente

  df = df.astype("float", errors = "ignore") 

Todas las columnas son todavía cadenas / objetos. Similar,

 df[["B", "C"]] = df[["B", "C"]].apply(pd.to_numeric) 

convierte ambas columnas (aunque “B” es int y “C” es “float”, debido a que el valor NaN está presente), pero

 df = df.apply(pd.to_numeric) 

obviamente arroja un mensaje de error y no veo una manera de suprimir esto.
¿Existe la posibilidad de realizar esta conversión de cadena-flotación sin pasar por cada columna, para probar .astype("float", errors = "ignore") ?

Creo que necesitas errors='ignore' parámetros errors='ignore' en to_numeric :

 df = df.apply(pd.to_numeric, errors='ignore') print (df.dtypes) A object B int64 C float64 dtype: object 

Funciona bien si no hay valores mixtos – numéricos con cadenas:

 df_list = [["a", "t", "2"], ["b", "3", np.nan]] df = pd.DataFrame(df_list, columns = list("ABC")) df = df.apply(pd.to_numeric, errors='ignore') print (df) ABC 0 at 2.0 <=added t to column B for mixed values 1 b 3 NaN print (df.dtypes) A object B object C float64 dtype: object 

EDITAR:

Puedes bajar también int a float s:

 df = df.apply(pd.to_numeric, errors='ignore', downcast='float') print (df.dtypes) A object B float32 C float32 dtype: object 

Es lo mismo que

 df = df.apply(lambda x: pd.to_numeric(x, errors='ignore', downcast='float')) print (df.dtypes) A object B float32 C float32 dtype: object