如何将字符串形式的字典列安全解析并展开为多列

发布时间 - 2026-01-25 00:00:00    点击率:

本文介绍如何在 python 中安全地将 dataframe 中存储为字符串的字典(如 `"{827056812014862: [0.05, 0.0608, 0.476464, 0.53535]}"`)解析为结构化表格,提取键为 `id`、列表元素依次映射为 `t1`, `t2`, `t3`, `t4` 等独立列。

在实际数据处理中,常遇到将嵌套结构以字符串形式存储于单列的情况(例如日志导出、API 响应或低规范数据库导出)。直接使用 eval() 解析存在严重安全风险,推荐使用 ast.literal_eval() —— 它仅支持安全的字面量(如 dict、li

st、float、int、str),可有效防止代码注入。

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

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 s in df["column_A"]:
    try:
        d = literal_eval(s)  # 安全转换字符串为 dict
        for key, values in d.items():
            if isinstance(values, (list, tuple)) and len(values) == 4:
                records.append({
                    "id": key,
                    "t1": values[0],
                    "t2": values[1],
                    "t3": values[2],
                    "t4": values[3]
                })
            else:
                raise ValueError(f"Unexpected value format: {values}")
    except (ValueError, SyntaxError) as e:
        print(f"Warning: Skipping invalid string '{s}' — {e}")
        continue

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

? 关键注意事项:

  • 永远避免 eval():它可执行任意 Python 表达式,存在严重安全隐患;literal_eval() 是唯一推荐替代方案。
  • ⚠️ 添加异常处理:真实数据中可能存在格式错误、空值或长度不一致的列表,务必用 try/except 包裹解析逻辑。
  • ? 扩展性建议:若列表长度不固定,可用 **{f"t{i}": v for i, v in enumerate(values, 1)} 动态生成列名(如答案中所示),再通过 pd.json_normalize() 或 pd.concat() 统一列结构。
  • ? 性能优化(大数据量):对超大规模数据,可改用 apply + pd.Series 向量化展开(需确保每行仅含一个 key-value 对),但需注意内存开销。

该方法兼顾安全性、可读性与工程鲁棒性,适用于 ETL 流程、数据清洗及 Pandas 标准化预处理场景。


# python  # js  # json  # 大数据  # app  # ai  # 数据清洗 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: JavaScript中如何操作剪贴板_ClipboardAPI怎么用  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  如何用景安虚拟主机手机版绑定域名建站?  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  如何在阿里云部署织梦网站?  5种Android数据存储方式汇总  米侠浏览器网页背景异常怎么办 米侠显示修复  如何在云主机上快速搭建多站点网站?  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  如何在Tomcat中配置并部署网站项目?  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  Laravel如何升级到最新版本?(升级指南和步骤)  EditPlus中的正则表达式实战(5)  C++用Dijkstra(迪杰斯特拉)算法求最短路径  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  Laravel Session怎么存储_Laravel Session驱动配置详解  如何在云服务器上快速搭建个人网站?  网站制作企业,网站的banner和导航栏是指什么?  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  JS弹性运动实现方法分析  网站优化排名时,需要考虑哪些问题呢?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  如何快速生成橙子建站落地页链接?  C#如何调用原生C++ COM对象详解  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  Python自动化办公教程_ExcelWordPDF批量处理案例  Linux系统命令中tree命令详解  Laravel如何实现API速率限制?(Rate Limiting教程)  香港服务器如何优化才能显著提升网站加载速度?  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  JS经典正则表达式笔试题汇总  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  北京企业网站设计制作公司,北京铁路集团官方网站?  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  如何在 Pandas 中基于一列条件计算另一列的分组均值  高端建站三要素:定制模板、企业官网与响应式设计优化  北京网站制作的公司有哪些,北京白云观官方网站?  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  UC浏览器如何设置启动页 UC浏览器启动页设置方法  如何实现建站之星域名转发设置?  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  如何快速完成中国万网建站详细流程?  原生JS获取元素集合的子元素宽度实例