pandas - 将 df.index 从 float64 更改为 unicode 或字符串

Posted

技术标签:

【中文标题】pandas - 将 df.index 从 float64 更改为 unicode 或字符串【英文标题】:pandas - change df.index from float64 to unicode or string 【发布时间】:2016-05-23 23:01:37 【问题描述】:

我想将数据帧的索引(行)从 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

【问题讨论】:

【参考方案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,它基本上是其元素的 ma​​chine 类型:这样,numpy 直接处理原生类型,而不是 Python 对象,这解释了它是如何这么快的。因此,当您将 dtype 从 int64 更改为 float64 时,numpy 将强制转换 C 代码中的每个元素。

还有一个特殊的 dtype:object,它基本上会提供一个指向 Python 对象的指针。

如果你想要字符串,那么你必须使用 object dtype。但是使用.astype(object) 不会给你你正在寻找的答案:它会用 object dtype 创建一个索引,但将 Python 浮点对象放在里面。

在这里,通过使用 map,我们使用适当的函数将索引转换为字符串:numpy 获取字符串对象并了解索引必须具有 object dtype,因为这是唯一的 dtype可以容纳字符串。

【讨论】:

这不适用于 Python 3.5。你知道为什么吗? 原发帖人使用的是 Python 2。unicode 类型在 Python 3 中不再存在,必须使用 str 类型代替(基本上,在 Python 中称为 str 2 在 Python 3 中被称为bytesunicode 同样变成了str)。请参阅this question 了解更多信息。 我在 Python 3 中尝试过这个,它没有改变任何东西。我正在尝试将索引从 Object 更改为 String。 @PMcK 我遇到了同样的问题。成功了吗?【参考方案2】:

对于 python 3 和 pandas 0.19 或更高版本,我发现以下对我来说很好

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

【讨论】:

有时需要df.index = df.index.astype(int) 而不是copy=False @MicheldeRuiter 你能告诉我什么时候需要分配而不是 copy=False 吗? @VaM999 我不记得了... :-( 我在使用 copy=False 并且类型为 np.uint64 时遇到问题,输出将不再是无符号的

以上是关于pandas - 将 df.index 从 float64 更改为 unicode 或字符串的主要内容,如果未能解决你的问题,请参考以下文章

将级别附加到 pandas MultiIndex

将 datetime64[ns] 索引转换为日期 pandas 以进行比较

pandas更换index,column名称

pandas

pandas

pandas