gpt4 book ai didi

python - pandas str 和 object 类型之间的区别

转载 作者:IT老高 更新时间:2023-10-28 21:10:22 25 4
gpt4 key购买 nike

Numpy 似乎区分了 strobject 类型。例如我可以做::

>>> import pandas as pd
>>> import numpy as np
>>> np.dtype(str)
dtype('S')
>>> np.dtype(object)
dtype('O')

其中dtype('S')和dtype('O')分别对应strobject

然而,pandas 似乎缺乏这种区别,并将 str 强制转换为 object。::

>>> df = pd.DataFrame({'a': np.arange(5)})
>>> df.a.dtype
dtype('int64')
>>> df.a.astype(str).dtype
dtype('O')
>>> df.a.astype(object).dtype
dtype('O')

强制类型为 dtype('S') 也无济于事。::

>>> df.a.astype(np.dtype(str)).dtype
dtype('O')
>>> df.a.astype(np.dtype('S')).dtype
dtype('O')

对这种行为有什么解释吗?

最佳答案

Numpy 的字符串 dtypes 不是 python 字符串。

因此,pandas 故意使用原生 python 字符串,这需要 object dtype。

首先,让我演示一下我所说的 numpy 的字符串不同的含义:

In [1]: import numpy as np
In [2]: x = np.array(['Testing', 'a', 'string'], dtype='|S7')
In [3]: y = np.array(['Testing', 'a', 'string'], dtype=object)

现在,'x' 是一个 numpy 字符串 dtype(固定宽度,类似 c 的字符串),而 y 是一个原生 python 字符串数组。

如果我们尝试超过 7 个字符,我们会立即看到差异。字符串 dtype 版本将被截断:

In [4]: x[1] = 'a really really really long'
In [5]: x
Out[5]:
array(['Testing', 'a reall', 'string'],
dtype='|S7')

虽然对象 dtype 版本可以是任意长度:

In [6]: y[1] = 'a really really really long'

In [7]: y
Out[7]: array(['Testing', 'a really really really long', 'string'], dtype=object)

接下来,|S dtype 字符串无法正确保存 unicode,尽管也有 unicode 固定长度字符串 dtype。我暂时跳过一个例子。

最后,numpy 的字符串实际上是可变的,而 Python 字符串不是。例如:

In [8]: z = x.view(np.uint8)
In [9]: z += 1
In [10]: x
Out[10]:
array(['Uftujoh', 'b!sfbmm', 'tusjoh\x01'],
dtype='|S7')

出于所有这些原因,pandas 选择永远不允许使用类似 C 的固定长度字符串作为数据类型。正如您所注意到的,在 pandas 中尝试将 python 字符串强制转换为固定的 numpy 字符串是行不通的。相反,它总是使用原生 Python 字符串,这对大多数用户来说表现得更加直观。

关于python - pandas str 和 object 类型之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34881079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com