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,它基本上是其元素的 machine 类型:这样,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 中被称为bytes
,unicode
同样变成了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 或字符串的主要内容,如果未能解决你的问题,请参考以下文章