看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
pandas Series 的标签对齐是指在进行运算或操作时,Pandas 会根据索引标签自动对齐数据。这是 Pandas 中一个重要而强大的特性,确保在不同索引标签上的数据能够正确对齐,而不会因为索引的不同而导致错误的结果。
使用原始 NumPy 数组(ndarray)时,通常不需要逐值循环,pandas 操作时也是如此。比如我将两个序列向量化相加:
import numpy as np
arr1 = np.array([1, 2, 3, 0])
arr2 = np.array([4, 5, 6, 0])
arr1
# array([1, 2, 3, 0])
arr2
# array([4, 5, 6, 0])
arr1 + arr2
# array([5, 7, 9, 0])
arr1 * arr2
# array([ 4, 10, 18, 0])
arr1 == arr2
# array([False, False, False, True])
arr1 >= arr2
# array([False, False, False, True])
可以看到是按照位置顺序进行向量化操作,同时也遵从广播原则,对一定不同形状的数据进行操作。
Series 和 ndarray 之间的一个关键区别是 Series之间的操作会根据标签自动对齐数据,因此在数据顺序不同时,它们帮助我们将相同标签的数据进行操作。
Series 之间也可以执行向量化操作,它们严格遵循标签对齐,比如:
import pandas as pd
import numpy as np
pd.__version__
# '2.1.1'
arr1 = np.array([1, 2, 3, 0])
arr2 = np.array([4, 5, 6, 0])
s1 = pd.Series(arr1, index=[*'bcde'])
s2 = pd.Series(arr2, index=[*'abce'])
s1
'''
b 1
c 2
d 3
e 0
dtype: int64
'''
s2
'''
a 4
b 5
c 6
e 0
dtype: int64
'''
ser1 + ser2
'''
a NaN
b 6.0
c 8.0
d NaN
e 0.0
dtype: float64
'''
s1 * s2
'''
a NaN
b 5.0
c 12.0
d NaN
e 0.0
dtype: float64
'''
未对齐系列之间的操作结果将包含所涉及的索引的并集。如果在一个或另一个系列中找不到标签,则结果将标记为缺少NaN。
通常,我们选择使不同索引对象之间的操作的默认结果产生索引的并集,以避免信息丢失。尽管缺少数据,但具有索引标签通常是计算的重要信息。当然,您可以通过dropna函数删除缺少数据的标签。
对于向量化操作没有对齐的标签,我们可以使用相关方法给定指定的值参与计算。
s1.add(s2, fill_value=1)
'''
a 5.0
b 6.0
c 8.0
d 4.0
e 0.0
dtype: float64
'''
s1.mul(s2, fill_value=0)
'''
a 0.0
b 5.0
c 12.0
d 0.0
e 0.0
dtype: float64
'''
以上是加法和乘法计算中,对于没有对齐的值按 1 或者 0 来计算的方法。
s1.eq(s2)
'''
a False
b False
c False
d False
e True
dtype: bool
'''
s1.equals(s2)
# False
以上是值比较 ==
操作的示例,得到一个布尔序列。要注意的是,equals() 方法是判断两个 Series 对象是否相等,并不是向量化操作。
我们也可以将没有对齐的 NAN 值进行填充,如:
(s1 + s2).fillna(0)
'''
a 0.0
b 6.0
c 8.0
d 0.0
e 0.0
dtype: float64
'''
将没有对齐而产生的 NAN 值填充为 0。
也可以将没有对齐的值删除掉,如:
(s1 + s2).dropna()
'''
b 6.0
c 8.0
e 0.0
dtype: float64
'''
以上只保留中对齐的值。
Series 的 align() 方法可以来测试对齐另外一个 Series,如:
s1.align(s2)
'''
(a NaN
b 1.0
c 2.0
d 3.0
e 0.0
dtype: float64,
a 4.0
b 5.0
c 6.0
d NaN
e 0.0
dtype: float64)
'''
产生了一个元组,第一个元素将原 Series 没有对齐的标签对应值设置为 NAN,而第二个元素将被对齐的 Series 无法对齐的标签对应值设置为 NAN。
未对齐系列之间的操作结果将包含所涉及的索引的并集。如果在一个或另一个系列中找不到标签,则结果将标记为缺少NaN。如:
import pandas as pd
arr1 = np.array([3, 6, 9])
arr2 = np.array([True, False, True, False])
s1 = pd.Series(arr1, index=[*'abc'])
s2 = pd.Series(arr2, index=[*'abce'])
s1
'''
a 3
b 6
c 9
dtype: int64
'''
s2
'''
a True
b False
c True
e False
dtype: bool
'''
s1[s2]
'''
a 3
c 9
dtype: int64
'''
s2 是一个布尔序列来抽取 s1 中的值,其中 s2 的 e 是多出来的,尽管如此它依然可以完成数据的抽取。但是,如果布尔序列 s2 中没有任一个 s1 的标签则会报错,这个特点一定要记住。
标签的对齐概念非常重要,贯穿于我们所有的 pandas 的计算中,所以我们一定要熟练理解的掌握。
(完)
更新时间:2023-12-08 22:19:41 标签:pandas python 标签 对齐