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

