本文介绍如何在 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)✅ 输出结果:
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
? 关键要点与注意事项:
该方法兼顾安全性、可读性与工程实用性,适用于绝大多数“字符串化字典 → 扁平表格”的转换任务。