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

2026-01-25 00:00:00 作者:花韻仙語

本文介绍如何使用 ast.literal_eval 安全解析 dataframe 中形如 {key: [v1, v2, v3, v4]} 的字符串列,并将其高效拆分为独立的 id 列与数值列(t1–t4),适用于日志解析、api 响应预处理等场景。

在实际数据处理中,我们常遇到将嵌套结构以字符串形式存储于单列的情况(例如数据库导出或 API 返回的 JSON-like 字符串)。直接用 eval() 解析存在严重安全风险,而 ast.literal_eval() 是 Python 标准库提供的安全替代方案——它仅允许解析基本字面量(字典、列表、数字、字符串、布尔值和 None),拒绝执行任意代码,因此推荐在生产环境中使用。

以下是一个完整、可复现的解决方案:

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]}"
    ]
})

# 步骤 1:安全解析字符串为字典
# 注意:原始字符串中 key 无引号,但 literal_eval 支持整数 key(只要语法合法)
parsed_dicts = df["column_A"].apply(literal_eval)

# 步骤 2:展开为扁平化记录列表
records = []
for d in parsed_dicts:
    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]
        })

# 步骤 3:构建新 DataFrame
result = pd.DataFrame(records)
print(result)

✅ 输出结果完全匹配预期:

                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

? 关键注意事项:

  • 若原始字符串中 key 是

    字符串(如 {"827056812014862": [...]}),literal_eval 同样兼容;但若 key 缺少引号且含非法字符(如空格、小数点),则会报错——此时需先清洗字符串。
  • 对于大规模数据,上述循环方式清晰易懂;若追求性能,可用 pd.json_normalize() 配合预处理,但前提是字符串能统一转为标准 JSON 格式(需补全引号等)。
  • 建议始终添加类型与长度校验(如示例中的 isinstance 和 len(values) != 4),避免因脏数据导致静默错误或列错位。

该方法兼顾安全性、可读性与健壮性,是处理“伪字典字符串列”的工业级实践方案。

猜你喜欢

联络方式:

400 9058 355

邮箱:8955556@qq.com

Q Q:8955556

微信二维码
在线咨询 拨打电话

电话

400 9058 355

微信二维码

微信二维码