Cadenas en un DataFrame, pero dtype es objeto

¿Por qué las pandas me dicen que tengo objetos, aunque cada elemento de la columna seleccionada es una cadena, incluso después de una conversión explícita?

Este es mi DataFrame:

 Int64Index: 56992 entries, 0 to 56991 Data columns (total 7 columns): id 56992 non-null values attr1 56992 non-null values attr2 56992 non-null values attr3 56992 non-null values attr4 56992 non-null values attr5 56992 non-null values attr6 56992 non-null values dtypes: int64(2), object(5) 

Cinco de ellos son dtype object . Convierto explícitamente esos objetos a cadenas:

 for c in df.columns: if df[c].dtype == object: print "convert ", df[c].name, " to string" df[c] = df[c].astype(str) 

Entonces, df["attr2"] todavía tiene el dtype object , aunque el type(df["attr2"].ix[0] revela str , que es correcto.

Las pandas distinguen entre int64 y float64 y object . ¿Cuál es la lógica detrás de esto cuando no hay dtype str ? ¿Por qué está cubierta una str por un object ?

El objeto dtype proviene de NumPy, describe el tipo de elemento en un ndarray. Cada elemento en un ndarray debe tener el mismo tamaño en bytes. Para int64 y float64, son 8 bytes. Pero para las cadenas, la longitud de la cadena no es fija. Entonces, en lugar de guardar los bytes de las cadenas en el ndarray directamente, Pandas usa el objeto ndarray, que guarda los punteros a los objetos, debido a esto, el tipo de este tipo ndarray es el objeto.

Aquí hay un ejemplo:

  • la matriz int64 contiene 4 valores int64.
  • la matriz de objetos contiene 4 punteros a 3 objetos de cadena.

introduzca la descripción de la imagen aquí

La respuesta aceptada es buena. Solo quería dar una respuesta que hiciera referencia a la documentación . La documentación dice:

Pandas usa el tipo de objeto para almacenar cadenas.

Como dice el comentario principal: “No te preocupes por eso; se supone que es así”. (Aunque la respuesta aceptada hizo un gran trabajo explicando el “por qué”; las cadenas son de longitud variable

Pero para las cadenas, la longitud de la cadena no es fija.