使用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
相关产品推荐
相关产品推荐

