看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
我们来看一下 series 的向量化操作。在日常的数据计算中,我们对两个列表需要进行求值,比如说以 a 和 b 这两个列表为例:
a, b = [1, 2, 3], [4, 5, 6]
a
# [1, 2, 3]
b
# [4, 5, 6]
它们的长度相同,我们可能需要对对应位置进行相加,或者相减以及更加复杂的操作。
我们将 a 和 b 的值进行相加:
a + b
# [1, 2, 3, 4, 5, 6]
乘法也是重复元素:
a * 2
# [1, 2, 3, 1, 2, 3]
此时我们得到了一个 a 加 b 的拼接操作结果,并不是我们理想中的对应位置的相加操作。
如果只用 Python 原生的方法我们需要利用循环来进行这样的一个向量化操作。我们在这里使用 zip() 来帮助我们进行位置的对齐,我们利用列表推导式来完成这样的一个操作。
[i+j for i,j in zip(a, b)]
# [5, 7, 9]
这样的话就是一个向量操作,我们得到的结果是 a b 相同长度的数列,对应位置上是他们对应值的相加。
对每个值乘以 2:
[i*2 for i in a]
# [2, 4, 6]
但是 pandas Series 能够方便地让我们完成这样的向量化操作。我们将这两个列表定义为两个 Series:
import pandas as pd
idx = [*'abc']
s1, s2 = (
pd.Series(a, index=idx),
pd.Series(b, index=idx)
)
s1
'''
a 1
b 2
c 3
dtype: int64
'''
s2
'''
a 4
b 5
c 6
dtype: int64
'''
直接操作两个序列相加:
s1 + s2
'''
a 5
b 7
c 9
dtype: int64
'''
对一个序列计算乘法、次幂和加法:
s1 * 3
'''
a 3
b 6
c 9
dtype: int64
'''
s1**2
'''
a 1
b 4
c 9
dtype: int64
'''
s1+10
'''
a 11
b 12
c 13
dtype: int64
'''
向量操作是 NumPy 提供的底层的计算引擎支持,它的各种函数也是支持向量化的操作的。
我们这里引入一些 NumPy 的操作我们对 Series 进行一些数学公式方面的求值。
求正弦,我们得到了每一个值的弧度的正弦值:
import numpy as np
np.sin(s1)
'''
a 0.841471
b 0.909297
c 0.141120
dtype: float64
'''
Series 的三次方:
np.power(s1, 3)
'''
a 1
b 8
c 27
dtype: int64
'''
向量化操作过程中它会自动地对标签值进行对齐。我们在这儿定义两个 Series,他们的标签会有一些不同:
import pandas as pd
a, b = [1, 2, 3], [4, 5, 6]
s3, s4 = (
pd.Series(a, index=[*'bcd']),
pd.Series(b, index=[*'abc'])
)
s3
'''
b 1
c 2
d 3
dtype: int64
'''
s4
'''
a 4
b 5
c 6
dtype: int64
'''
s3 的索引标签没有 a,s4 的索引标签为, 有 d,其他标签相同。这时我们进行向量化相加:
s3 + s4
'''
a NaN
b 6.0
c 8.0
d NaN
dtype: float64
'''
只有共有的 b 和 c 标签才会相加,其他非共有标签结果值为 NaN,是一个缺失值。
如果想去掉缺失值可以对新得到的 Series 对象调用 dropna() 方法:
(s3 + s4).dropna()
'''
b 6.0
c 8.0
dtype: float64
'''
这样,就只保留它们共有的部分。
Series 的向量化操作思想贯穿整体数据科学计算全过程中,我们只有深入理解这种思想才能摆脱 Python 的复杂循环迭代,从而更加高效完成计算任务。
(完)
更新时间:2022-11-15 15:19:47 标签:pandas series 向量