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

Polars中对全列使用drop_nans()异常及正确用法咨询

解决Polars DataFrame仅删除NaN行的问题

问题原因分析

你之前的代码出现异常行为,核心是对API用法的误解:

  • drop_nans()是Series专属方法,作用是返回当前列移除NaN后的结果,但不会改变DataFrame的行数。
  • 当你在with_columns(pl.all().drop_nans())中调用时,Polars会将处理后长度缩短的Series自动广播填充到原DataFrame的行数,导致a列的非NaN值1.0被重复填充,b列的null被保留并补全到对应行,最终出现不符合预期的输出。

另外,Polars的DataFrame确实没有drop_nans()方法,数值列中的NaN会被统一识别为null,因此需要通过drop_nulls()或过滤条件来实现需求。

正确实现方式

你的预期是仅删除包含NaN的行(即a列存在NaN的行),有两种简洁的实现方法:

方法1:使用drop_nulls()指定检查列

利用Polars将数值列NaN视为null的特性,通过subset参数指定仅检查a列的null(即NaN),删除对应行:

ex = pl.DataFrame(
    {
        'a': [float('nan'), 1, float('nan')],
        'b': [None, 'a', 'b']
    }
)

result = ex.drop_nulls(subset=['a'])
print(result)

输出结果:

shape: (1, 2)
┌─────┬─────┐
│ a   ┆ b   │
│ --- ┆ --- │
│ f64 ┆ str │
├─────┼─────┤
│ 1.0 ┆ a   │
└─────┴─────┘

方法2:直接过滤非NaN行

通过is_not_nan()条件精准筛选a列不是NaN的行,逻辑更直观:

result = ex.filter(pl.col('a').is_not_nan())
print(result)

输出结果与方法1完全一致。


内容的提问来源于stack exchange,提问作者NotAName

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:24:52