【问题标题】:Pandas: Is Series homogenous?熊猫:系列是同质的吗?
【发布时间】:2022-01-15 04:46:39
【问题描述】:

熊猫系列是同质的还是异质的?

import pandas as pd
S=pd.Series([1,2,3,1.5,'US',True,False,'India'])
>>> S
0        1
1        2
2        3
3      1.5
4       US
5     True
6    False
7    India
dtype: object
>>> S[3]
1.5
>>> type(S[5])
<class 'bool'>

【问题讨论】:

  • 同质。该系列的数据类型为object。并且其中的所有内容都是对象的子类型(因为 python 中的所有内容都是对象的子类型)。
  • @Henry 根据该定义,Python 中没有数据是异构的。这是真的吗?
  • @wjandrea 在 python 中你可以有一个列表[1, 'a', 6.2],它包含不同的类型并且是异构的。在转换为 dtype 对象结构的 numpy 和 pandas 中,而在 python 示例中,列表本身没有类型(它只是 list)只有包含的元素具有类型。关键区别在于,您可以在不重新分配结构的情况下向列表中添加内容,向 Series 引入新值可能会强制 Series 的 dtype 发生变化。这与动态类型的 python 结构不同。
  • @Henry Gotcha,系列本身是同质的(系列必须根据定义)。但是它引用的数据是异构的,因为它是不同类型的,对吧?
  • @wjandrea 我相信这是正确的,因为 Series 必须只有一个 dtype(即使该 dtype 是 object)。不幸的是(如上所述)语义 dtype object 很困难,因为在 python 中确实没有任何东西不能放入对象容器中,因为(几乎)所有东西都是对象。

标签: python pandas series


【解决方案1】:

根据定义和文档系列是同质的。

Series 定义为:

带有轴标签(包括时间序列)的一维 ndarray

ndarray 定义为:

一个数组对象表示一个多维、同质固定大小的项目数组。

(双引号中我的粗体)

然而,dtype 系列object 很棘手。由于几乎所有python中的东西都可以被认为是object,因此这种Series可以引用大量不同类型的变量。因此,虽然 Series 本身是对象引用的同质集合,但这些单独的对象在被引用时可能具有异构子类型。

访问系列中的每个单独的值将导致它们的单独类型被暴露,但是,我们只有保证系列中的所有元素都是object类型。


在处理字符串或从碎片化的 DataFrame 中提取行时,我们最常得到 Series of dtype object

import pandas as pd

df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': ['x', 'y', 'z'],
    'C': [3.4, 5.6, 7.8]
})

s1 = df['B']
s2 = df.iloc[0, :]

s1(B 栏):

0    x
1    y
2    z
Name: B, dtype: object

s2(第 0 行):

A      1
B      x
C    3.4
Name: 0, dtype: object

我们可以看到,pandas 使用Series.str.upper 之类的方法无法确定dtype object 的字符串列和包含dtype 混合类型object 的列之间的区别:

s1.str.upper()

0    X
1    Y
2    Z
Name: B, dtype: object
s2.str.upper()

A    NaN
B      X
C    NaN
Name: 0, dtype: object

请注意(在 pandas 1.3.5 中)数字(intfloat)值已转换为 NaN。这不会引发任何错误或警告。

(这也适用于提供的示例系列)

pd.Series([1, 2, 3, 1.5, 'US', True, False, 'India']).str.upper()

0      NaN
1      NaN
2      NaN
3      NaN
4       US
5      NaN
6      NaN
7    INDIA
dtype: object

同样,这是因为 pandas 将这个 Series 视为对象的同质集合,这允许使用 dtype 受限的.str 方法。

【讨论】:

    猜你喜欢
    • 2018-09-04
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 2018-02-17
    • 2013-01-01
    • 2017-09-15
    • 2020-03-17
    • 2014-06-15
    相关资源
    最近更新 更多