如何从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
相关产品推荐
相关产品推荐

