python - tablas - seleccionar columnas de un dataframe pandas
Buscar todas las columnas de marco de datos en pandas cuyo tipo es flotante o un tipo particular? (2)
Esto es 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])
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 el error ocurrió con las columnas cuyo tipo es float64 (¡qué mensaje de error engañoso!)
entonces 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, menos elegantemente, 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 '''' por ''desconocido'' el código funcionaría para ciertas celdas pero falló con una celda con el error de "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 para todas las columnas que usan 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 del objeto:
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 funcione aquí):
In [16]: df.loc[:, df.dtypes == object] = df.loc[:, df.dtypes == object].fillna('''')
Diciendo eso, te recomiendo que uses NaN para los datos faltantes .