如何以更简洁地道的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
相关产品推荐
相关产品推荐

