如何在Polars中将两列合并为{key:value}字典格式?
如何在Polars中将两列合并为{key:value}字典格式?
嘿,我来帮你搞定这个需求!你想要把Polars DataFrame里的两列合并成每行一个{key:value}的字典列,对吧?我给你两种实用的方法,你可以根据自己的场景选择。
首先先把你的示例数据再贴出来,方便我们对照:
import polars as pl df = pl.DataFrame({ "name": ["Chuck", "John", "Alice"], "surname": ["Dalliston", "Doe", "Smith"] })
方法一:直观的逐行构造法(适合小数据集或快速验证)
用map_elements可以很直观地对每行的两个字段进行处理,直接返回我们需要的字典:
df = df.with_columns( name_surname=pl.struct("name", "surname").map_elements( lambda x: {x["name"]: x["surname"]}, return_dtype=pl.Dict(pl.String, pl.String) ) )
这里我们先把name和surname列打包成一个struct,然后用map_elements遍历每个struct,把它转换成以name值为键、surname值为值的字典,同时指定返回类型为pl.Dict确保类型正确。
运行后你就能得到预期的结果:
shape: (3, 3) ┌───────┬──────────┬──────────────────────────┐ │ name │ surname │ name_surname │ │ --- │ --- │ --- │ │ str │ str │ dict[str, str] │ ├───────┼──────────┼──────────────────────────┤ │ Chuck │ Dalliston│ {"Chuck": "Dalliston"} │ │ John │ Doe │ {"John": "Doe"} │ │ Alice │ Smith │ {"Alice": "Smith"} │ └───────┴──────────┴──────────────────────────┘
方法二:更简洁的zip写法
如果你觉得上面的struct打包有点麻烦,也可以直接用zip把两列的值配对,再转成字典:
df = df.with_columns( name_surname=pl.col("name").zip(pl.col("surname")).map_elements( lambda x: {x[0]: x[1]}, return_dtype=pl.Dict(pl.String, pl.String) ) )
这个方法和第一种本质上差不多,只是用zip替代了struct来配对每行的两个值,代码更紧凑一点。
小提醒
- 如果你处理的是超大型数据集,逐行处理的
map_elements可能会比向量化操作慢一点,但对于大多数日常场景来说完全够用。 - 记得指定
return_dtype,这样Polars能明确知道新列的类型,避免自动推断可能带来的问题。
备注:内容来源于stack exchange,提问作者Dante
相关产品推荐
相关产品推荐

