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
相关产品推荐
相关产品推荐

