Pandas: Series 是同质的吗?

Pandas: Is Series homogenous?

Pandas系列是同质的还是异质的?

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'>

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

Series 定义为:

One-dimensional ndarray with axis labels (including time series).

ndarray 定义为:

An array object represents a multidimensional, homogeneous array of fixed-size items.

(在两个引号中加粗我的)

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

访问系列中的每个单独值将导致暴露其各自的类型,但是,我们可以保证系列中的所有元素都是类型object.


我们最常在处理字符串时或从零散的 DataFrame 中提取行时得到 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无法使用[=33]之类的方法来区分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 将此系列视为对象的同质集合,这允许使用 dtype 受限 .str 方法。