Polars DataFrame按列/按行逻辑运算:求更简洁实现方案
在Polars中简化布尔DataFrame的any/all运算实现
针对你提到的Polars里行掩码、全局布尔值写法繁琐的问题,这里提供三种场景的简洁替代方案,完全贴合Polars的原生API设计:
1. 获取包含"?"的列掩码
你的原有写法已经足够简洁,也可以写成更紧凑的等价形式:
(pl_df == "?").select(pl.all().any()) # 或者 pl_df.select(pl.all().eq("?").any())
2. 获取包含"?"的行掩码
不用再拼接列表、嵌套eval,直接用Polars专门用于横向行维度运算的pl.any_horizontal()函数:
(pl_df == "?").select(pl.any_horizontal(pl.all())) # 等价简化写法 pl_df.select(pl.any_horizontal(pl.all().eq("?")))
该函数会对每一行的所有列布尔值做OR运算,直接输出每行的掩码结果。
3. 获取全局是否存在"?"的单个布尔值
可以基于行掩码结果直接聚合,或者一步到位链式调用:
# 方法1:基于行掩码结果聚合 (pl_df == "?").select(pl.any_horizontal(pl.all())).to_series().any() # 方法2:直接链式调用 (pl_df == "?").any_horizontal(pl.all()).any() # 方法3:先列维度聚合再全局判断 pl_df.select(pl.all().eq("?").any()).to_series().any()
这些方案完全利用Polars的原生横向运算API,避免了不必要的列表转换和嵌套操作,代码更简洁且性能更优。
内容的提问来源于stack exchange,提问作者AAriam
相关产品推荐
相关产品推荐

