看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
今天我们来讲一下 Series 传入一个布尔序列进行数据抽取。利用这个机制可以帮助我们理解 pandas 中数据查询筛选的原理。
首先我们构造一个 Series 导入 pandas 库别名为 pd,我们构造一个非常简单的数据:1、2、3:
import pandas as pd
ser = pd.Series([1, 2, 3])
ser
'''
0 1
1 2
2 3
dtype: int64
'''
然后将这个数据打印出来我们看到这样的一个整型的 Series。
这时,我们在它的索引操作在里面传入一个列表,这个列表是和它对应长度的一个布尔序列:
ser[[True, False, True]]
'''
0 1
2 3
dtype: int64
'''
我们发现对应位置为 True 的值被选中了。
NumPy 的 ndarray 和 pandas 的 Series 都是序列,因此也能传入它们的布尔值结构。
传入 NumPy 的 ndarray 布尔序列:
import numpy as np
arr = np.array([True, False, True])
arr
# array([ True, False, True])
ser[arr]
'''
0 1
2 3
dtype: int64
'''
传入 pandas 的 Series 布尔序列:
bool_ser = pd.Series([True, False, True])
bool_ser
'''
0 True
1 False
2 True
dtype: bool
'''
ser[bool_ser]
'''
0 1
2 3
dtype: int64
'''
之前的内容我们讲过,Series 的支持向量操作,比较操作将产生布尔序列。如:
ser > 1
'''
0 False
1 True
2 True
dtype: bool
'''
将这个表达式传入抽取操作中:
ser[ser > 1]
'''
1 2
2 3
dtype: int64
'''
这样便筛选出了比较操作语义中大于1的数据。我们再来一个类似操作:
ser[ser < 3]
'''
0 1
1 2
dtype: int64
'''
同样按语义完成了筛选。
将筛选出的数据可能直接进行修改:
ser[ser > 1] = 0
ser
'''
0 1
1 0
2 0
dtype: int64
'''
我们可以看到大于 1 的数据被修改为 0。
利用上述的向量化比较,我们可以将多个筛选条件进行位动作,从而得到新的布尔序列。比如使用上边两个比较的与运算:
(ser > 1) & (ser < 3)
'''
0 False
1 True
2 False
dtype: bool
'''
ser[(ser > 1) & (ser < 3)]
'''
1 2
dtype: int64
'''
完成了满足两个条件的筛选,查询出两个条件都满足的数据。再来一个或运算:
ser[(ser == 1) | (ser == 3)]
'''
0 1
2 3
dtype: int64
'''
查询出等于1或等于3的数据。最终演示一个非运算,选择出不为 1 的数据:
ser[~(ser == 1)]
'''
1 2
2 3
dtype: int64
'''
查询出不等于 1 的值。
接下来再做一个这样的一个例子。
ser1 = pd.Series(['ab', 'bc', 'd'])
ser1
'''
0 ab
1 bc
2 d
dtype: object
'''
我们现在的需求是查询值中包含b的数据,利用str访问器的contains()方法,它能返回一个布尔序列来表示是否包含传入的值:
ser1.str.contains('b')
'''
0 True
1 True
2 False
dtype: bool
'''
将这个布尔序列放入抽取操作中:
ser1[ser1.str.contains('b')]
'''
0 ab
1 bc
dtype: object
'''
就完成了我们的需求。
Series 通过向量化的运算产生一个布尔序列,将这个布尔序列传入到 Series 的抽取操作中(就是大括号里面),就会完成数据的筛选。这部分筛选它是数据的一个视图,然后我们对这个数据可以查看,也可以进行修改。达到一个数据的筛选和修改操作。
在今后的 DataFrame 的操作中也是这样的一个机制,我们需要熟练的去理解和掌握。
(完)
更新时间:2022-09-18 09:06:18 标签:pandas series 布尔序列 抽取数据