Подтвердить что ты не робот

Pandas - изменить df.index из float64 в unicode или строку

Я хочу изменить индекс (строки) dataframes из float64 в строку или unicode.

Я думал, что это будет работать, по-видимому, не:

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

сообщение об ошибке:

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

Ответ 1

Вы можете сделать это следующим образом:

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

Что касается того, почему вы будете действовать иначе, чем когда бы вы конвертировали из int в float, это особенность numpy (библиотека, на которой основана pandas).

Каждый массив numpy имеет тип dtype, который в основном является типом машины его элементов: таким образом, numpy имеет дело непосредственно с собственными типами, а не с объектами Python, в котором объясняется, как это происходит так быстро. Поэтому, когда вы меняете dtype с int64 на float64, numpy будет отбрасывать каждый элемент в коде C.

Также имеется специальный объект dtype:, который будет в основном предоставлять указатель на объект Python.

Если вам нужны строки, вы должны использовать объект dtype. Но использование .astype(object) не даст вам ответ, который вы искали: вместо этого он создаст индекс с dtype объекта, но внутри него будут размещены объекты плавания Python.

Здесь, используя карту, мы преобразуем индекс в строки с соответствующей функцией: numpy получает строковые объекты и понимает, что индекс должен иметь объект dtype, потому что это единственный dtype, который может содержать строки.