¿Encuentra todas las columnas del marco de datos en Pandas cuyo tipo es flotante o un tipo en particular?

2 minutos de lectura

Tengo un marco de datos, 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:"

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

así que desearía poder hacer algo como

for col in df.columns[<dtype == object>]:
    df[col] = df[col].fillna("unknown")

Entonces, mi pregunta es si existe 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, reemplazando ” 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

Esto es más conciso:

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

  • para tu información, .select_dtypes salió en 0.14.1, IIRC @Andy soln fue anterior a eso

    – Jeff

    9 jun 2015 a las 19:59

Avatar de usuario de Andy Hayden
Andy Hayden

Puede ver cuál es el dtype para todas las columnas usando 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 Por supuesto que en su lugar funcionaría aquí):

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

Dicho esto, le recomiendo que use NaN para los datos faltantes.

Como dijo @RNA, puedes usar pandas.DataFrame.select_dtypes. El código que usa su ejemplo de una pregunta se vería así:

for col in df.select_dtypes(include=['object']).columns:
    df[col] = df[col].fillna('unknown')

¿Ha sido útil esta solución?