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

Polars DataFrame转numpy.ndarray时如何避免int列转float并保留None?

在Polars中将DataFrame转为numpy数组时保留None而非转为NaN

当Polars DataFrame包含null值时,直接调用.to_numpy()会将null转为np.NaN,导致原本的整数列被强制转为浮点型。要将null转为None,核心是利用numpy的object dtype(支持存储任意Python对象,包括None和整数),以下是两种可行方案:

方案1:通过迭代行生成Python对象数组

利用Polars的iter_rows(null_value=None)方法,将每行数据转为包含None的Python元组,再转换为numpy的object数组,能保留原始数据类型(整数仍为int,缺失值为None):

import polars as pl
import numpy as np

t = pl.DataFrame({
    'a': [1, 4, 3, 5],
    'b': [3, 6, 2, None],
})

# 迭代每行并替换null为None,再转为numpy object数组
row_tuples = [tuple(row) for row in t.iter_rows(null_value=None)]
result_arr = np.array(row_tuples, dtype=object)

print(result_arr)

输出结果:

[[1 3]
 [4 6]
 [3 2]
 [5 None]]

方案2:先转numpy数组再替换NaN为None

先调用.to_numpy()得到含NaN的浮点数组,再用np.where将NaN替换为None,最后转为object dtype。注意此方法会将原本的整数转为浮点型(如1变为1.0):

import polars as pl
import numpy as np

t = pl.DataFrame({
    'a': [1, 4, 3, 5],
    'b': [3, 6, 2, None],
})

# 先转numpy数组,再替换NaN为None并转为object类型
float_arr = t.to_numpy()
result_arr = np.where(np.isnan(float_arr), None, float_arr).astype(object)

print(result_arr)

输出结果:

[[1.0 3.0]
 [4.0 6.0]
 [3.0 2.0]
 [5.0 None]]

关键说明

numpy的原生数值类型(如int32、float64)无法存储None,只能用NaN表示缺失值,这也是整数列被转为浮点型的原因。使用object dtype的数组可以绕过这个限制,但会牺牲部分数值运算性能,需根据实际场景选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 13:26:04