¿Encontrar todas las columnas de dataframe en Pandas cuyo tipo es float, o un tipo en particular?

Tengo un dataframe, df, que tiene algunas columnas de tipo float64, mientras que las otras son de objeto. Debido a la naturaleza mixta, no puedo usar

df.fillna('unknown') #getting error "ValueError: could not convert string to float:" 

como ocurrió el error con las columnas cuyo tipo es float64 (¡qué mensaje de error engañoso!)

así que me gustaría poder hacer algo como

 for col in df.columns[]: df[col] = df[col].fillna("unknown") 

Entonces, mi pregunta es si hay alguna expresión de filtro que pueda usar con df.columns?

Supongo que alternativamente, con menos elegancia, podría hacer:

  for col in df.columns: if (df[col].dtype == dtype('O')): # for object type df[col] = df[col].fillna('') # still puzzled, only empty string works as replacement, 'unknown' would not work for certain value leading to error of "ValueError: Error parsing datetime string "unknown" at position 0" 

También me gustaría saber por qué en el código anterior al reemplazar ” con ‘desconocido’ el código funcionaría para ciertas celdas pero falló con una celda con el error “ValueError: Error al analizar la cadena de fecha y hora” desconocido “en la posición 0”

¡Muchas gracias!

Yu

Puede ver cuál es el tipo de dtype para todas las columnas que utilizan el atributo dtypes:

 In [11]: df = pd.DataFrame([[1, 'a', 2.]]) In [12]: df Out[12]: 0 1 2 0 1 a 2 In [13]: df.dtypes Out[13]: 0 int64 1 object 2 float64 dtype: object In [14]: df.dtypes == object Out[14]: 0 False 1 True 2 False dtype: bool 

Para acceder a las columnas de objetos:

 In [15]: df.loc[:, df.dtypes == object] Out[15]: 1 0 a 

Creo que es más explícito de usar (no estoy seguro de que funcionaría aquí):

 In [16]: df.loc[:, df.dtypes == object] = df.loc[:, df.dtypes == object].fillna('') 

Dicho esto, te recomiendo que uses NaN para los datos que faltan .

Esto es conciser:

 # select the float columns df_num = df.select_dtypes(include=[np.float]) # select non-numeric columns df_num = df.select_dtypes(exclude=[np.number])