You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Polars DataFrame中将负值替换为其他值且避免列名重复错误

如何在Polars DataFrame中将负值替换为其他值且避免列名重复错误

嗨,我来帮你搞定这个问题~

首先咱们得搞懂报错的原因:你写的代码里,select同时传入了两个部分——一是所有Float64类型的原列,二是对这些列做负值替换后的结果列。这就导致每一个Float64列都会在最终结果里出现两次:一次是原列,一次是处理后的列。而且因为你没给处理后的列指定别名,Polars会默认给它们分配名字(比如错误里提到的literal),当处理多个列时,就会出现大量重名的默认列,直接触发了DuplicateError。

你说不想重命名列,这完全没问题!因为你的核心需求应该是把原列里的负值换成NaN,而不是保留原列再新增一列,所以只要调整代码的写法就能解决:

方法1:用with_columns直接更新原列(推荐)

这个方法会直接在原DataFrame的基础上修改对应列的值,列名完全保持不变:

import polars as pl
import numpy as np

# 直接更新所有Float64列,把负值替换为NaN
x_origin = x_origin.with_columns(
    pl.col(pl.Float64)
    .when(pl.col(pl.Float64) < 0)
    .then(pl.nan())  # 用Polars原生的nan,性能比np.nan更好
    .otherwise(pl.col(pl.Float64))
)

方法2:用select只保留处理后的列

如果你更习惯用select,那只要去掉原列的选择,只保留处理后的表达式就行——这样生成的列名会和原列完全一致,不会有重复:

x_origin = x_origin.select(
    pl.col(pl.Float64)
    .when(pl.col(pl.Float64) < 0)
    .then(pl.nan())
    .otherwise(pl.col(pl.Float64))
)

小提醒

尽量用Polars原生的pl.nan()代替np.nan,因为Polars对原生表达式的优化更好,能避免不必要的Python对象转换,运行速度会更快哦~

这样调整后,既实现了把负值替换为NaN的需求,又完全保留了原列的名字,不会再碰到重复列名的错误啦!

备注:内容来源于stack exchange,提问作者forestbat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 16:29:50