web-dev-qa-db-fra.com

pandas - changez df.index de float64 en unicode ou string

Je veux changer l'index d'un dataframes (lignes) de float64 à string ou unicode 

Je pensais que cela fonctionnerait mais apparemment pas:

#check type
type(df.index)
'pandas.core.index.Float64Index'

#change type to unicode
if not isinstance(df.index, unicode):
    df.index = df.index.astype(unicode)

message d'erreur:

TypeError: Setting <class 'pandas.core.index.Float64Index'> dtype to anything other than float64 or object is not supported
38
Boosted_d16

Vous pouvez le faire de cette façon:

# for Python 2
df.index = df.index.map(unicode) 

# for Python 3 (the unicode type does not exist and is replaced by str)
df.index = df.index.map(str)

Quant à savoir pourquoi vous procéderiez différemment de la conversion d’int en float, c’est une particularité de numpy (la bibliothèque sur laquelle sont basés les pandas).

Chaque tableau numpy a un dtype, qui est essentiellement le type machine de ses éléments: de cette manière, numpy traite directement avec les types natifsexplique comment c'est si rapide. Ainsi, lorsque vous changez le type de données de int64 en float64, numpy convertit chaque élément dans le code C.

Il existe également un type spécial: object, qui fournira un pointeur vers un objet Python.

Si vous voulez des chaînes, vous devez donc utiliser le type object dtype. Mais utiliser .astype(object) ne vous donnerait pas la réponse que vous cherchiez: il créerait plutôt un index avec object dtype, mais y placerait des objets float Python.

Ici, en utilisant map, nous convertissons l'index en chaînes avec la fonction appropriée: numpy récupère les objets chaîne et nous comprenons que l'index doit avoir un type object ddype, car il s'agit du seul type pouvant prendre en charge les chaînes.

56
Arthur

Pour Python 3 et Pandas 0.19 ou les versions ultérieures, j’ai trouvé que cela fonctionnait bien

    # Python 3 (pandas 0.19 or latter versions)
    df.index.astype(str, copy = False)
1
Chia-Yu Chien