如何高效转换Polars中含键值对的字符串列?
Polars 键值对字符串转独立列的高效实现
针对你需求的场景,完全可以用Polars内置的向量化操作实现高效转换,无需提前预处理所有可能的键,自动识别所有出现的键并生成对应列,缺失值自动填充为null。以下是两种简洁高效的实现方式:
方法一:基于字符串分割与Struct处理
import polars as pl # 原始DataFrame df = pl.DataFrame({ "apple": [1, 2, 3], "data": ["a=b, b=c", "a=y, y=z", "k1=v1, k2=v2"] }) # 转换逻辑 result = ( df .with_row_index() # 添加临时索引用于后续合并 .with_columns( # 将data列拆分为键值对列表,再转为Struct格式 pl.col("data") .str.split(", ") .list.eval(pl.element().str.split("=", 1)) .list.eval(pl.struct(key=pl.element()[0], value=pl.element()[1])) .alias("key_value") ) .explode("key_value") # 展开每个键值对 .pivot( index="index", columns="key_value.key", values="key_value.value", aggregate_function=lambda x: x.first() ) .join(df.with_row_index(), on="index", how="left") # 合并回原始数据 .drop("index") # 移除临时索引 .select(pl.col("apple"), pl.exclude("apple", "data"), pl.col("data")) # 调整列顺序 ) print(result)
方法二:基于正则提取(更简洁)
如果键值对的格式比较规范,用正则提取会更简洁:
result = ( df .with_row_index() .with_columns( # 用正则匹配所有键值对,捕获键和值 pl.col("data").str.extract_all(r"([^=]+)=([^,]+)").alias("matches") ) .explode("matches") .with_columns( pl.col("matches").list.get(0).alias("key"), pl.col("matches").list.get(1).alias("value") ) .pivot(index="index", columns="key", values="value") .join(df.with_row_index(), on="index") .drop("index") .select("apple", pl.exclude("apple", "data"), "data") )
核心优势
- 无需预处理:自动从数据中识别所有出现的键,无需提前枚举所有可能的键
- 高效向量化:所有操作都是Polars内置的向量化运算,性能远优于Python循环或手动处理
- 自动填充缺失值:
pivot操作会自动为不存在的键填充null
内容的提问来源于stack exchange,提问作者Chris Wong
相关产品推荐
相关产品推荐

