Pourquoi Pandas me dit-il que j'ai des objets, bien que chaque élément de la colonne sélectionnée soit 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 le 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, a df["attr2"]
encore dtype object
, bien que type(df["attr2"].ix[0]
révèle str
, ce qui est correct.
Pandas fait la distinction entre int64
et float64
et object
. Quelle est la logique derrière cela quand il n'y a pas dtype str
? Pourquoi est str
couvert par object
?
Réponses:
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 octets. Pour int64 et float64, ils font 8 octets. Mais pour les chaînes, la longueur de la chaîne n'est pas fixe. Ainsi, au lieu de sauvegarder directement les octets des chaînes dans le ndarray, les Pandas utilisent object ndarray, qui enregistre des pointeurs vers des objets, à cause de cela, le type de ce type ndarray est object.
Voici un exemple:
la source
La réponse acceptée est bonne. Je voulais juste fournir une réponse faisant référence à la documentation . La documentation dit:
Comme le dit le commentaire principal "Ne vous en faites pas, c'est censé être comme ça." (Bien que la réponse acceptée ait fait un excellent travail en expliquant le «pourquoi»; les chaînes sont de longueur variable)
la source
astype(str)
bien que je me demande toujours que la conversion de chaîne est nécessaireLa réponse de @ HYRY est excellente. Je veux juste fournir un peu plus de contexte.
Les tableaux de données stockées sous la forme contiguë , de taille fixe des blocs de mémoire. La combinaison de ces propriétés est ce qui rend les baies ultra-rapides pour l'accès aux données. Par exemple, examiner comment votre ordinateur peut stocker un tableau d'entiers 32 bits,
[3,0,1]
.Si vous demandez à votre ordinateur de récupérer le 3ème élément du tableau, il commencera au début, puis sautera sur 64 bits pour atteindre le 3ème élément. Savoir exactement combien de bits sauter est ce qui rend les tableaux rapides .
Considérons maintenant la séquence de chaînes
['hello', 'i', 'am', 'a', 'banana']
. Les chaînes sont des objets dont la taille varie, donc si vous essayez de les stocker dans des blocs de mémoire contigus, cela finira par ressembler à ceci.Maintenant, votre ordinateur ne dispose pas d'un moyen rapide d'accéder à un élément demandé au hasard. La clé pour surmonter cela est d'utiliser des pointeurs. Fondamentalement, stockez chaque chaîne dans un emplacement de mémoire aléatoire et remplissez le tableau avec l'adresse mémoire de chaque chaîne. (Les adresses mémoire ne sont que des entiers.) Alors maintenant, les choses ressemblent à ceci
Maintenant, si vous demandez à votre ordinateur de récupérer le 3ème élément, comme auparavant, il peut sauter sur 64 bits (en supposant que les adresses mémoire sont des entiers de 32 bits) puis faire une étape supplémentaire pour aller chercher la chaîne.
Le défi pour NumPy est qu'il n'y a aucune garantie que les pointeurs pointent réellement vers des chaînes. C'est pourquoi il signale le dtype comme «objet».
Je vais sans vergogne brancher mon propre article de blog où j'en ai discuté à l'origine.
la source
À partir de la version 1.0.0 (janvier 2020), pandas a été introduit en tant que fonctionnalité expérimentale offrant un support de première classe pour les types de chaînes via
pandas.StringDtype
.Alors que vous serez toujours voyez
object
par défaut, le nouveau type peut être utilisé en spécifiant undtype
despd.StringDtype
ou simplement'string'
:la source
The implementation may change without warning.
ce qui signifie que les nouvelles mises à jour casseront vos anciens programmes.