当前位置: 首页 > 面试题库 >

str和对象类型之间的熊猫区别

朱通
2023-03-14
问题内容

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

但是熊猫似乎就缺少了区分,并要挟strobject。::

>>> 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字符串,这需要对象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尽管也有unicode定长字符串dtype,但dtype字符串无法正确保存unicode。现在,我将跳过一个示例

最后,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的固定长度字符串作为数据类型。如您所知,尝试将python字符串强制转换为numpy固定字符串将无法在中运行pandas。相反,它始终使用本机python字符串,对于大多数用户而言,它们的行为更为直观。



 类似资料:
  • 问题内容: 我从“ Head First Java”学习“多态”,然后想到了这个概念。有人可以举例说明吗? 编译器检查引用类型的类,而不是对象类型。 那么引用类型和对象类型之间有什么区别? 问题答案: 我认为它们对“对象类型”和“引用类型”的使用不是标准化的,但这是我的解释。 考虑以下代码: 该 引用 是类型的。它引用的 对象 是类型。 因此,“引用类型”为,“对象类型”为。 造成这种混乱的原因是

  • 问题内容: 我正在尝试过滤出包含产品列表的数据框。但是,我遇到了熊猫-每当我运行代码时,“ dataframe”对象都没有属性“ str”错误。 这是代码行: 如果有人有任何建议的想法,请告诉我。我已经搜索了很多次,而且非常困惑。 产品是对象数据类型。 编辑: 这是头: 编辑2:这是print(data),A是产品。当我将其打印出来时,看起来好像A不在类别产品下。 问题答案: 答案很简单: 改变成

  • 问题内容: 如果我只是通过类似下面的函数,DataFrame.aggregate()和DataFrame.apply()函数之间的返回值的(类型)是否有任何区别 因为返回值看起来几乎一样。并且文档仅告诉: apply()-> apply:Series或DataFrame 聚合()->聚合:DataFrame 问题答案: agg有两种版本(aggregate的缩写)和适用:第一个版本在groupby

  • 问题内容: 我是Kotlin的新手,最近将一个简单文件从Java转换为Kotlin。我想知道为什么Android转换器将我的java类更改为Kotlin对象。 Java: 转换的Kotlin: 为什么不呢? 任何帮助将不胜感激谢谢。 问题答案: Kotlin对象就像一个无法实例化的类,因此必须按名称进行调用。(本身是静态类) android转换器看到您的类仅包含静态方法,因此将其转换为Kotlin

  • 问题内容: 比如说我有一个叫做Phone的类。 之间有什么区别? 和 和 我已经搜索过,甚至在Eclipse上尝试过,但无法弄清楚。 问题答案: 只声明一个引用处理程序,该处理程序不会指向任何地方(它是未初始化的,除非您为其分配了某些内容,否则无法使用[感谢@Anthony])。 声明一个引用处理程序,该处理程序指向一个新创建的对象(用初始化)。 创建一个新对象,但是由于没有引用存储在任何地方,因

  • 我在研究“头先Java”中的多态性,并由此产生了这个概念。谁能举个例子解释一下吗? 编译器检查引用类型的类,而不是对象类型。 那么引用类型和对象类型之间有什么区别呢?