将字典格式字符串安全解析并展开为多列结构

将字典格式字符串安全解析并展开为多列结构

本文介绍如何在 python 中将 dataframe 中存储为字符串的字典(如 `”{827056812014862: [0.05, 0.0608, 0.476464, 0.53535]}”`)安全解析、解包,并转换为结构化表格,生成独立的 id 列与多个数值列(t1–t4)。

数据清洗与 ETL 场景中,常遇到将嵌套结构(尤其是以字符串形式存储的字典或列表)扁平化的需求。直接使用 eval() 存在严重安全风险,因此推荐使用 ast.literal_eval —— 它仅支持安全的字面量表达式(如 dict, list, float, int),可防止代码注入。

以下是一个完整、健壮的解决方案:

import pandas as pd
from ast import literal_eval

# 示例原始数据
df = pd.DataFrame({
    "column_A": [
        "{827056812014862 : [0.05, 0.0608, 0.476464, 0.53535]}",
        "{263746262748835 : [0.08, 0.0333, 0.8263, 0.9463]}",
        "{63673738736362 : [0.05, 0.0926, 0.8694, 0.9903]}",
        "{73737681201484 : [0.08, 0.0425, 0.1948, 0.3958]}"
    ]
})

# 安全解析 + 展开为标准 DataFrame
records = []
for dict_str in df["column_A"]:
    # 安全转为 dict(自动处理空格、换行等常见格式问题)
    d = literal_eval(dict_str)
    for key, values in d.items():
        # 确保 values 是长度为 4 的列表(可按需扩展校验)
        if not isinstance(values, (list, tuple)) or len(values) != 4:
            raise ValueError(f"Unexpected value format for key {key}: {values}")
        records.append({
            "id": key,
            "t1": values[0],
            "t2": values[1],
            "t3": values[2],
            "t4": values[3]
        })

result = pd.DataFrame(records)
print(result)

输出结果:

AdsGo AI

AdsGo AI

全自动 AI 广告专家,助您在数分钟内完成广告搭建、优化及扩量

下载

                id    t1      t2        t3       t4
0  827056812014862  0.05  0.0608  0.476464  0.53535
1  263746262748835  0.08  0.0333  0.826300  0.94630
2   63673738736362  0.05  0.0926  0.869400  0.99030
3   73737681201484  0.08  0.0425  0.194800  0.39580

? 关键要点与注意事项:

  • 永远避免 eval():它会执行任意 Python 表达式,极易引发安全漏洞;literal_eval 是唯一推荐的安全替代方案。
  • 健壮性增强:实际生产中建议添加异常捕获(如 try/except)和日志,便于定位非法字符串(例如缺失括号、类型错误)。
  • 性能优化(大数据量):若数据量极大(>10 万行),可改用向量化方式(如先 apply(literal_eval) 得到 Series of dicts,再用 pd.json_normalize 配合自定义展开逻辑),但本例的显式循环更清晰、易调试、内存友好。
  • 列名与索引灵活性:t{i} 命名可通过 enumerate(…, start=1) 控制起始编号;如需动态适配不同长度的列表,可用 pd.DataFrame(values).T.add_prefix(‘t’) 后合并。

该方法兼顾安全性、可读性与工程实用性,适用于绝大多数“字符串化字典 → 扁平表格”的转换任务。

https://www.php.cn/faq/2028091.html

发表回复

Your email address will not be published. Required fields are marked *