如何对pandas布尔型Series列表执行逐元素逻辑与聚合
问题场景
在pandas中持有2个以上布尔型Series时,直接使用&运算符执行search[0] & search[1]可以正确返回布尔型Series,结果示例如下:
search[0] & search[1] # 输出 0 True 1 False dtype: bool
实际需求是支持传入Series组成的列表,直接返回聚合后的布尔型Series,类似sum(search)的调用形式。但直接调用Python内置sum(search)会返回数值型计数结果,示例如下:
sum(search) # 输出 0 2 1 0 dtype: int64
目前可通过自定义循环函数实现逐位与聚合的需求,代码如下:
def sum_bool_series(bool_list): r = bool_list[0] for l in bool_list[1:]: r = r & l return r
需要确认pandas是否提供对应的原生实现方式。
原生实现方法
pandas原生支持该类聚合需求,不需要手写循环:
- 逐位与聚合(即所有Series对应位置均为True时结果才为True,和自定义函数逻辑一致):将列表中所有布尔Series按列拼接后,对每行做全True判断即可
该方法会自动按索引对齐所有Series,避免手写循环时可能出现的索引不匹配问题,返回值直接是布尔类型Series。import pandas as pd and_result = pd.concat(search, axis=1).all(axis=1) - 逐位或聚合(即任意一个Series对应位置为True时结果就为True,对应
|运算符的聚合逻辑):将all()替换为any()即可or_result = pd.concat(search, axis=1).any(axis=1)
如果偏好函数式写法,也可以使用functools.reduce实现链式运算,但可读性和鲁棒性弱于上述concat方案:
from functools import reduce and_result = reduce(lambda x, y: x & y, search)
注意:不要直接使用Python内置
sum处理布尔Series聚合,内置sum会默认将布尔值转为整数1/0做数值求和,无法得到布尔类型的逐位聚合结果。
内容的提问来源于stack exchange,提问作者NiRR
相关产品推荐
相关产品推荐

