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
?
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:
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.