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

Polars中select与[]取列转numpy结果差异及类pandas.values实现方法

Polars单列一维NumPy数组获取方案

两种写法维度差异的原因

  • df['some_col'] 直接返回单列对应的Series对象,Series.to_numpy()默认输出一维数组,但该方括号取列的语法属于Polars的兼容写法,官方不推荐在生产代码中使用,后续版本存在行为变更风险。
  • df.select('some_col') 返回值始终是DataFrame结构(即使仅选择单列),DataFrame.to_numpy()会严格按照表的二维结构输出,因此会返回形状为(行数, 1)的二维数组,这是两种写法返回结果维度不一致的根本原因。

问题复现代码参考:

import polars as pl
data = {"a": [1, 2], "b": [3, 4]}
df = pl.DataFrame(data)

print(df['a'].to_numpy())
# 输出: [1 2]

print(df.select('a').to_numpy())
# 输出: [[1]
#       [2]]

官方推荐的一维数组获取写法

Polars提供了稳定API可以直接获取单列的一维NumPy数组,无需依赖不推荐的方括号索引,也不需要对二维数组做额外的维度压缩操作,效果完全等价于pandas中df.select('some_column').values获取单列一维值数组的行为:

  1. 用get_column方法直接取列(最简洁)
    该方法是官方指定的按列名取单列的标准API,返回Series对象后直接转NumPy即可得到一维数组:
    arr = df.get_column("a").to_numpy()
    print(arr)
    # 输出: [1 2]
    print(arr.shape)
    # 输出: (2,)
    
  2. select后转Series再输出数组
    如果已经写了select逻辑选了单列,可以链式调用to_series()将单列表转为Series后再转NumPy,结果和上面完全一致:
    arr = df.select("a").to_series().to_numpy()
    print(arr)
    # 输出: [1 2]
    

注意:不推荐对df.select('col').to_numpy()返回的二维数组调用squeeze()、flatten()做维度转换,这类写法属于冗余绕路,性能不如直接操作Series,且在列数意外变动时容易出现不符合预期的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:54:37