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)
问题解答
其他用户能否复现该现象?
能复现。Polars 0.18.10版本调整了字典解析逻辑:0.18.9版本中apply返回的字典会按非插入顺序解析,而0.18.10及后续版本会遵循Python 3.7+的字典插入顺序,因此不同版本运行上述代码会得到不同列顺序,使用对应版本的用户可复现该差异。列顺序是否有官方保障,还是仅为实现细节?
列顺序属于实现细节,无官方保障。Polars官方文档未承诺apply返回字典后unnest的列顺序固定,底层处理逻辑(如字典解析、聚合逻辑)可能随版本优化调整,进而影响列顺序。若无法保障列顺序,有无方法确保预期顺序,还是需手动重排列?
有多种方式可确保预期列顺序:
- 手动指定列顺序:
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
相关产品推荐
相关产品推荐

