电话
400 9058 355
本文介绍如何使用 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
? 关键注意事项:

该方法兼顾安全性、可读性与健壮性,是处理“伪字典字符串列”的工业级实践方案。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...