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

Polars映射函数执行后的列顺序问题咨询

Polars分组聚合后列顺序变更问题解答

测试代码

import polars
import numpy as np

df = polars.DataFrame(dict(
  j=np.tile([1, 0, 0], 3),
  k=np.random.randint(10, 99, 9)
))

def f(ks):
  return dict(
    u=ks[0] + 100,
    i=ks[1] + 200,
    o=ks[2] + 300,
  )

dfj = (df
  .groupby(polars.col('j').cumsum(), maintain_order=True)
  .agg(
    polars.col('k').apply(f).alias('k')
  )
  .unnest('k')
)
print(polars.__version__)
print(dfj)

问题解答

  1. 其他用户能否复现该现象?
    能复现。Polars 0.18.10版本调整了字典解析逻辑:0.18.9版本中apply返回的字典会按非插入顺序解析,而0.18.10及后续版本会遵循Python 3.7+的字典插入顺序,因此不同版本运行上述代码会得到不同列顺序,使用对应版本的用户可复现该差异。

  2. 列顺序是否有官方保障,还是仅为实现细节?
    列顺序属于实现细节,无官方保障。Polars官方文档未承诺apply返回字典后unnest的列顺序固定,底层处理逻辑(如字典解析、聚合逻辑)可能随版本优化调整,进而影响列顺序。

  3. 若无法保障列顺序,有无方法确保预期顺序,还是需手动重排列?
    有多种方式可确保预期列顺序:

  • 手动指定列顺序:unnest后用select明确指定列顺序,例如:
    dfj = dfj.select(['j', 'u', 'i', 'o'])
    
  • 返回有序结构替代字典:将函数f改为返回带字段名的polars.Series,固定顺序:
    def f(ks):
        return polars.Series([ks[0]+100, ks[1]+200, ks[2]+300], name=['u', 'i', 'o'])
    
  • 使用struct类型明确字段顺序:聚合时转为指定字段顺序的struct,再unnest:
    dfj = (df
      .groupby(polars.col('j').cumsum(), maintain_order=True)
      .agg(
        polars.col('k').apply(lambda ks: polars.struct(u=ks[0]+100, i=ks[1]+200, o=ks[2]+300)).alias('k')
      )
      .unnest('k')
    )
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 20:33:35