pandas - change df.index from float64 to unicode or string

PythonPandasIndexingDataframeRows

Python Problem Overview


I want to change a dataframes' index (rows) from float64 to string or unicode.

I thought this would work but apparently not:

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

error message:

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

Python Solutions


Solution 1 - Python

You can do it that way:

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

As for why you would proceed differently from when you'd convert from int to float, that's a peculiarity of numpy (the library on which pandas is based).

Every numpy array has a dtype, which is basically the machine type of its elements : in that manner, numpy deals directly with native types, not with Python objects, which explains how it is so fast. So when you are changing the dtype from int64 to float64, numpy will cast each element in the C code.

There's also a special dtype : object, that will basically provide a pointer toward a Python object.

If you want strings, you thus have to use the object dtype. But using .astype(object) would not give you the answer you were looking for : it would instead create an index with object dtype, but put Python float objects inside.

Here, by using map, we convert the index to strings with the appropriate function: numpy gets the string objects and understand that the index has to have an object dtype, because that's the only dtype that can accomodate strings.

Solution 2 - Python

For python 3 and pandas 0.19 or latter versions, I found the following works fine for me

    # Python 3 (pandas 0.19 or latter versions)
    df.index.astype(str, copy = False)

Solution 3 - Python

For me this works the best:

df.index = df.index.astype('int64')

where int64 can be changed into other types

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBoosted_d16View Question on Stackoverflow
Solution 1 - PythonArthurView Answer on Stackoverflow
Solution 2 - PythonChia-Yu ChienView Answer on Stackoverflow
Solution 3 - Pythongumpy007View Answer on Stackoverflow