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获取单列一维值数组的行为:
- 用
get_column方法直接取列(最简洁)
该方法是官方指定的按列名取单列的标准API,返回Series对象后直接转NumPy即可得到一维数组:arr = df.get_column("a").to_numpy() print(arr) # 输出: [1 2] print(arr.shape) # 输出: (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
相关产品推荐
相关产品推荐

