2016-02-12 3 views
23

Ich möchte den Index eines Datenrahmens (Zeilen) von float64 in String oder Unicode ändern.pandas - df.index von float64 in Unicode oder String ändern

dachte ich, das funktionieren würde, aber offenbar nicht:

#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) 

Fehlermeldung:

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

Antwort

36

Sie können es auf diese Weise tun:

# 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) 

Was, warum Sie gehen würde Anders als bei der Konvertierung von int in float ist das eine Besonderheit von numpy (der Bibliothek, auf der pandas basiert).

Jedes numpy Array hat eine dtype, die im Grunde die Art seiner Elemente Maschine ist: auf diese Weise, numpy Angebote direkt mit einheimischen Arten, nicht mit Python-Objekte, die erklärt, wie es so schnell ist, . Wenn Sie den dtype von int64 in float64 ändern, wird numpy jedes Element in den C-Code umwandeln.

Es gibt auch einen speziellen dtype: Objekt, die im Grunde einen Zeiger auf ein Python-Objekt bieten wird.

Wenn Sie Zeichenfolgen wollen, müssen Sie also das Objekt dtype verwenden. Aber die Verwendung von .astype(object) würde Ihnen nicht die Antwort geben, nach der Sie gesucht haben: Sie würde stattdessen einen Index mit Objekt dtype erstellen, aber Python-Float-Objekte einfügen.

Hier auf der Karte verwenden, wandeln wir den Index in Strings mit der entsprechenden Funktion: numpy die String-Objekte bekommt und verstehen, dass der Index einen Objekt dtype haben muss, denn das ist die einzige dtype ist, die Strings empfangen kann.

+0

Dies funktioniert nicht auf Python 3.5. Hast du eine Ahnung warum? –

+2

Das ursprüngliche Poster verwendete Python 2. Der 'Unicode' Typ existiert nicht mehr in Python 3 und stattdessen muss der' str' Typ verwendet werden (im Grunde heißt das, was in Python 2 'str' genannt wurde,' Bytes' in Python 3 und "Unicode" wurden ebenfalls zu "str". Siehe [diese Frage] (http://stackoverflow.com/questions/19877306/nameerror-global-name-unicode-is-not-defined-in-python-3) für weitere Informationen. – Arthur