如何在Polars DataFrame中排除日期列替换超阈值值为0
Polars 替换指定列中超过阈值的值为0
你之前代码的问题
- 第一段代码用
pl.any_horizontal(pl.col(pl.Float32) > 20)会判断整行是否存在任意一个大于20的值,只要满足就把整行的Float32列全部置0,这和你要的「逐个元素判断」不符。 - 第二段代码缺少
otherwise分支,不满足条件的单元格会被设为null,且没有完整保留原列的逻辑。
正确实现方式
方式1:针对目标列逐元素判断
用with_columns遍历除date外的列(或指定Float32类型列),对每个元素单独判断:
# 针对所有Float32类型列(自动排除date列,假设date不是Float32) df = df.with_columns( pl.col(pl.Float32) .when(pl.col(pl.Float32) > 20) .then(0) .keep_name() # 保留原列名 ) # 明确排除date列(不管列类型) df = df.with_columns( pl.col(exclude="date") .when(pl.col(exclude="date") > 20) .then(0) .keep_name() )
方式2:类似Pandas的where写法
Polars支持和Pandas逻辑一致的where方法,满足条件保留原值,不满足则替换:
df = df.with_columns( pl.col(exclude="date").where(pl.col(exclude="date") <= 20, 0) )
这里的逻辑是:当列值≤20时保留原值,否则替换为0,和你熟悉的Pandas写法逻辑对齐。
内容的提问来源于stack exchange,提问作者thefrollickingnerd
相关产品推荐
相关产品推荐

