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

如何从Polars字符串列的字典结构中提取所有键?

从Polars DataFrame的字符串列提取字典键

需求:从Polars DataFrame的字符串列「C」中提取每行字典的键,生成包含KEYS列(类型为list[str])的DataFrame,每行的字典键均不重复。

给定的Polars DataFrame代码如下:

import polars as pl

df = pl.DataFrame({
   "A": ["a", "b", "a", "c","a","c","a","b","b"], 
   "B": [23,45,60,50,56,44,34,30,97], 
   "C": ["{'pattern1':['a','score1'],'pattern2':['df','text1']}",
        "{'pattern3':['abc','score1']}",
        "{'pattern1':['a','score2'],'pattern4':['df','text2']}",
        "{'pattern5':['a','score2'],'pattern6':['gh','text1'],'pattern7':['gh','text1']}",
        "{'pattern8':['a','score1']}",
        "{'pattern9':['a','score1'],'pattern10':['df','text1']}",
        "{'pattern11':['a','score1']}",
        "{'pattern12':['a','score1'],'pattern13':['df','text1']}",
        "{'pattern3':['a','score1'],'pattern5':['df','text1']}"]
})

解决方案

方法1:解析字符串为字典提取键

使用ast.literal_eval安全解析字符串为字典对象,再提取所有键:

import ast

result_df = df.with_columns(
    pl.col("C").map_elements(
        lambda x: list(ast.literal_eval(x).keys()),
        return_dtype=pl.List(pl.String)
    ).alias("KEYS")
)

该方法通用性强,适用于任何格式合法的字典字符串,且比直接使用eval更安全。

方法2:正则表达式提取(键格式固定时)

如果列「C」中的键格式固定为pattern加数字(如pattern1),可以用正则表达式直接匹配提取,效率更高:

result_df = df.with_columns(
    pl.col("C").str.extract_all(r"'(pattern\d+)'").alias("KEYS")
)

示例输出

运行上述代码后,得到的DataFrame如下:

shape: (9, 4)
┌─────┬─────┬───────────────────────────────────────────────────────────────────┬──────────────────────────────────────┐
│ A   ┆ B   ┆ C                                                                 ┆ KEYS                                 │
│ --- ┆ --- ┆ ---                                                               ┆ ---                                  │
│ str ┆ i64 ┆ str                                                               ┆ list[str]                            │
╞═════╪═════╪═══════════════════════════════════════════════════════════════════╪══════════════════════════════════════╡
│ a   ┆ 23  ┆ {'pattern1':['a','score1'],'pattern2':['df','text1']}             ┆ ["pattern1", "pattern2"]             │
│ b   ┆ 45  ┆ {'pattern3':['abc','score1']}                                     ┆ ["pattern3"]                         │
│ a   ┆ 60  ┆ {'pattern1':['a','score2'],'pattern4':['df','text2']}             ┆ ["pattern1", "pattern4"]             │
│ c   ┆ 50  ┆ {'pattern5':['a','score2'],'pattern6':['gh','text1'],'pattern7':[ ┆ ["pattern5", "pattern6", "pattern7"] │
│     ┆     ┆ 'gh','text1']}                                                    ┆                                      │
│ a   ┆ 56  ┆ {'pattern8':['a','score1']}                                       ┆ ["pattern8"]                         │
│ c   ┆ 44  ┆ {'pattern9':['a','score1'],'pattern10':['df','text1']}            ┆ ["pattern9", "pattern10"]            │
│ a   ┆ 34  ┆ {'pattern11':['a','score1']}                                      ┆ ["pattern11"]                        │
│ b   ┆ 30  ┆ {'pattern12':['a','score1'],'pattern13':['df','text1']}           ┆ ["pattern12", "pattern13"]           │
│ b   ┆ 97  ┆ {'pattern3':['a','score1'],'pattern5':['df','text1']}             ┆ ["pattern3", "pattern5"]             │
└─────┴─────┴───────────────────────────────────────────────────────────────────┴──────────────────────────────────────┘

内容的提问来源于stack exchange,提问作者Suresh Subramaniyan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 21:14:56