Skip to content
Series 对象

Series 对象

import pandas as pd
import numpy as np

Series 是一个带标签的一维数组,能够保存任何数据类型(整数、字符串、浮点数、Python 对象等)。轴 axis 标签统称为索引 index

创建 Series 对象

创建 Serires 对象需要提供 dataindex 两个参数。其中 index 是需要传入的索引,即轴标签列表。因此,根据数据类型可以分为如下几种情况:

ndarray

如果 datandarray,则 index 必须与 data 的长度相同。

pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
a   -0.247457
b    0.127203
c    0.048504
d   -1.802860
e   -1.480528
dtype: float64

如果没有传递索引,则将创建一个具有值 [0, ..., len(data) - 1] 的索引。

pd.Series(np.random.randn(5))
0   -0.218089
1   -1.875552
2   -0.351250
3    2.237674
4    0.794604
dtype: float64

dict

pd.Series({'b': 1, 'a': 0, 'c': 2})
b    1
a    0
c    2
dtype: int64

标量值

如果数据是标量值,则必须提供索引。该值将重复以匹配索引的长度。

pd.Series(5.0, index=['a', 'b', 'c', 'd', 'e'])
a    5.0
b    5.0
c    5.0
d    5.0
e    5.0
dtype: float64

Series 类似 ndarray

Series 的行为与 ndarray 非常相似,并且是大多数 NumPy 函数的有效参数。

索引和切片

注意:切片等操作也会对索引进行切片。

s = pd.Series(np.random.randn(5), index=["a", "b", "c", "d", "e"])
s
a    1.234485
b   -0.893518
c    0.400802
d   -1.328360
e   -1.023169
dtype: float64
s[0]
C:\Users\Fourier\AppData\Local\Temp\ipykernel_17908\243613605.py:1: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  s[0]





1.2344849322112634
s[:3]
a    1.234485
b   -0.893518
c    0.400802
dtype: float64

矩阵索引

s[s > s.median()]
a    1.234485
c    0.400802
dtype: float64

数学运算

np.exp(s)
a    3.436608
b    0.409214
c    1.493022
d    0.264911
e    0.359454
dtype: float64

ndarry 属性

s.array
<NumpyExtensionArray>
[ 1.2344849322112634, -0.8935181616923943, 0.40080196379724387,
 -1.3283596009432421,  -1.023169455667722]
Length: 5, dtype: float64
s.dtype
dtype('float64')

强制类型转换

s.to_numpy()
array([ 1.23448493, -0.89351816,  0.40080196, -1.3283596 , -1.02316946])

Series 类似 dict

Series 就像一个固定大小的 dict,可以通过索引标签获取和设置值:

s['a']
1.2344849322112634
s['e'] = 12.0
s
a     1.234485
b    -0.893518
c     0.400802
d    -1.328360
e    12.000000
dtype: float64
'e' in s, 'f' in s
(True, False)

如果未包含标签,会抛出异常:

try:
    s['f']
except KeyError:
    print('KeyError')
KeyError

使用 get 方法,缺少的标签将返回 None 或指定的默认值:

s.get('f')
s.get('f', np.nan)
nan

向量化操作和标签对齐

使用原始 NumPy 数组时,通常不需要逐个值循环。在 pandas 中使用 Series 时也是如此。Series 也可以传递给大多数需要 ndarrayNumPy 方法。

s + s
a     2.468970
b    -1.787036
c     0.801604
d    -2.656719
e    24.000000
dtype: float64
s * 2
a     2.468970
b    -1.787036
c     0.801604
d    -2.656719
e    24.000000
dtype: float64

Seriesndarray 之间的一个关键区别是 Series 之间的操作会根据标签自动对齐数据。因此,您可以编写计算而不考虑所涉及的系列是否具有相同的标签。

s[1:] + s[:-1]
a         NaN
b   -1.787036
c    0.801604
d   -2.656719
e         NaN
dtype: float64

未对齐系列之间的操作结果将包含所涉及的索引的并集。如果在一个系列或另一个系列中找不到标签,则结果将被标记为缺失 NaN

name 属性

s = pd.Series(np.random.randn(5), name="something")
s
0    0.715769
1   -0.089104
2    1.187363
3   -1.413279
4    0.272194
Name: something, dtype: float64
s.name
'something'

在许多情况下,Series 名称将自动分配,特别是在获取 DataFrame 的一维切片时。详见 DataFrame 章节。

new_s = s.rename('different')
new_s.name
'different'

请注意,snew_s 指的是不同的对象。

Last updated on