web-dev-qa-db-fra.com

Chaînes dans un DataFrame, mais dtype est object

Pourquoi Pandas m'indique-t-il que j'ai des objets, même si chaque élément de la colonne sélectionnée est une chaîne - même après une conversion explicite.

Voici mon DataFrame:

<class 'pandas.core.frame.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)

Cinq d'entre eux sont dtype object. Je convertis explicitement ces objets en chaînes:

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

Ensuite, df["attr2"] a toujours dtype object, bien que type(df["attr2"].ix[0] révèle str, ce qui est correct.

Les pandas font la distinction entre int64 et float64 et object. Quelle est la logique derrière tout cela quand il n'y a pas de dtype str? Pourquoi un str est-il couvert par object?

82
Xiphias

L'objet dtype provient de NumPy, il décrit le type d'élément dans un ndarray. Chaque élément d'un ndarray doit avoir la même taille en octet. Pour int64 et float64, il s'agit de 8 octets. Mais pour les chaînes, la longueur de la chaîne n'est pas fixée. Ainsi, au lieu de sauvegarder directement les octets de chaînes dans le ndarray, Pandas utilise object ndarray, qui enregistre les pointeurs dans les objets, à cause de cela, le type de ce type ndarray est object.

Voici un exemple:

  • le tableau int64 contient 4 valeurs int64.
  • le tableau d'objets contient 4 pointeurs sur 3 objets chaîne.

enter image description here

131
HYRY

La réponse acceptée est bonne. Je voulais juste fournir une réponse qui référencée dans la documentation . La documentation dit:

Les pandas utilisent le type d'objet pour stocker les chaînes.

Comme le dit le commentaire principal "Ne vous inquiétez pas, c'est censé être comme ça". (Bien que la réponse acceptée ait très bien expliqué le "pourquoi"; les chaînes sont de longueur variable)

Mais pour les chaînes, la longueur de la chaîne n'est pas fixée.

5
The Red Pea