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

如何以更简洁地道的Polars方式从字典创建指定结构的DataFrame

如何以更简洁地道的Polars方式从字典创建指定结构的DataFrame

嘿,我完全懂你想要更简洁、更贴合Polars风格写法的需求!你的现有实现确实能达成目标,但确实有更紧凑高效的方式来完成这个任务,下面给你分享几种地道的方案:

方案1:直接在DataFrame构造时完成列处理

这种写法把列的构造逻辑合并到一步,省去后续的with_columns和select操作,代码更紧凑:

import polars as pl

mapping = {
    'CASH':  {'qty':  1, 'origin': 'E'},
    'ITEM':  {'qty': -9, 'origin': 'A'},
    'CHECK': {'qty': 46, 'origin': 'A'},
}

df = pl.DataFrame(
    [{'type': k, 'mapping': pl.struct(v)} for k, v in mapping.items()]
)

方案2:利用from_dict的orient参数

借助Polars内置的from_dict方法,结合索引转列的逻辑,再打包struct:

df = pl.from_dict(mapping, orient="index")\
       .rename({"index": "type"})\
       .with_columns(mapping=pl.struct(pl.all().exclude("type")))\
       .select("type", "mapping")

这里orient="index"会把字典的键作为索引列,我们先将其重命名为type,再把剩余的qty和origin列打包成struct类型的mapping列,最后筛选出需要的两列即可。

方案3:最直观的列构造写法

这种写法直接明确地构造两个目标列,可读性拉满:

df = pl.DataFrame({
    "type": list(mapping.keys()),
    "mapping": [pl.struct(v) for v in mapping.values()]
})

以上三种方案最终都会生成你需要的DataFrame结构:

shape: (3, 2)
┌───────┬───────────┐
│ type ┆ mapping │
│ --- ┆ --- │
│ str ┆ struct[2] │
╞═══════╪═══════════╡
│ CASH ┆ {1,"E"} │
│ ITEM ┆ {-9,"A"} │
│ CHECK ┆ {46,"A"} │
└───────┴───────────┘

其中方案3我个人最推荐,代码简洁直观,完全贴合Polars的惯用写法,也不需要额外的链式调用~

备注:内容来源于stack exchange,提问作者Phil-ZXX

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 10:32:57