StringDtype 对象与 Python Pandas 中的对象 dtype 有何不同?

Pandas 不仅可以包含文本数据作为对象,还可以包含 Pandas 不理解的任何其他数据。这意味着,如果您说某列何时是 Object dtype,并不意味着该列中的所有值都是字符串或文本数据。事实上,它们可能是数字,也可能是字符串、整数和浮点数类型的混合。因此,由于这种不兼容,我们不能直接对该列进行任何字符串操作。

由于这个问题,pandas 1.0 版本引入了string dtype,但是我们需要明确定义它。

查看一些示例以了解 StringDtype 和 object dtype 的不同之处。

示例

list_ = ['python',90, 'string',2] # 分配一个列表
ds = pd.Series(list_) # 创建一个系列
print(ds) # 印刷系列
print()
print(type(ds[1])) # display type of 2nd element from dataSeries

解释

上面的代码创建了一个包含 3 个元素列表的 Pandas 系列,这些元素有字符串和整数。在最后一行,我们尝试获取第二个元素的数据类型。

输出结果

0   python
1       90
2   string
3        2
dtype: object

<class 'int'>

我们可以清楚地看到 ds Series 的 dtype 是一个对象,但是如果您尝试获取第二个元素的类型,它将以整数形式返回输出,而不是对象或字符串。因此得出结论,dtype 对象不仅仅存储文本数据,它是所有数据的混合。

示例

这里显式定义到 pandas 系列方法的 dtype 参数。pd.StringDtype()

list_ = ['python',90, 'string']
ds = pd.Series(list_, dtype=pd.StringDtype())
print(ds)
print()
print(type(ds[1]))

解释

在此示例中,我们通过将 dtype 参数值分配为字符串来更改系列的默认 dtype。我们再次尝试显示系列 ds 中的第二个元素的类型。

输出结果

0   python
1       90
2   string
dtype: string

<class 'str'>

系列 ds 的输出 dtype 是一个字符串,该 ds 的第二个元素的类型也是一个字符串。所以我们可以理解,dtype StringDtype 会改变所有数据的类型。

通过将 StringDtype 定义为文本数据,不会对执行字符串操作造成任何困难。这就是推荐使用 StringDtype 来存储所有文本数据的原因。