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
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')