You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pd.json_normalize时报'str' object has no attribute 'values'如何解决

错误原因

报错的核心原因是 transactions['extra_data'] 列的每个元素是JSON格式字符串,而非 pd.json_normalize() 要求的Python字典/嵌套列表结构。从数据库直接拉取JSON类型字段时,多数数据库驱动默认会将其序列化为字符串返回,不会自动转换为Python原生对象。pd.json_normalize() 执行时会尝试读取输入对象的values属性完成结构解析,字符串不存在该属性,因此抛出对应错误。

解决方案

首先需要将列内的JSON字符串转换为Python原生字典结构,再执行标准化操作:

  • 基础转换方案(适配所有JSON内容合法的场景)
import json
import pandas as pd

# 将JSON字符串转为Python字典
transactions['extra_data'] = transactions['extra_data'].apply(json.loads)
# 执行JSON结构标准化
normalized_df = pd.json_normalize(transactions['extra_data'])
  • 兼容脏数据的转换方案(适配存在空值、非法JSON的场景)
    如果数据中存在空值、空字符串或者格式异常的JSON,可以增加异常捕获逻辑避免转换中断:
import json
import pandas as pd

def safe_json_loads(s):
    try:
        # 处理空值、空字符串场景
        if pd.isna(s) or str(s).strip() == '':
            return {}
        return json.loads(s)
    except (json.JSONDecodeError, TypeError):
        # 非法JSON返回空字典,可根据业务需求调整返回值
        return {}

transactions['extra_data'] = transactions['extra_data'].apply(safe_json_loads)
normalized_df = pd.json_normalize(transactions['extra_data'])
  • 合并到原表
    如果需要将展开后的JSON字段和原DataFrame的其他字段合并,可以执行以下操作:
full_df = pd.concat([transactions.drop(columns=['extra_data']), normalized_df], axis=1)
可选优化

如果使用SQLAlchemy等工具从数据库拉取数据,可以在查询阶段配置JSON字段的序列化规则,直接返回Python字典结构,避免后续二次转换。

内容的提问来源于stack exchange,提问作者Alexey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 13:24:03