如何在Python Pandas中将DataFrame的JSON列转为常规列?
解决方法
核心问题原因
你遇到的报错是因为COL3(以及真实数据里的COL6、COL7)是字符串类型的JSON格式数据,而非Python字典对象。pd.json_normalize()需要接收字典/列表形式的输入,直接传入字符串会触发AttributeError。
分步实现解析
1. 导入依赖
先导入必要的库:
import pandas as pd import json from ast import literal_eval # 用于处理包含集合的特殊JSON字符串(如COL4)
2. 解析普通JSON字符串列(如COL3、COL6、COL7)
以COL3为例,先将字符串转为Python字典,再用json_normalize解析并合并到原表:
# 读取数据 ABT = pd.read_excel("ABT.xlsx") # 将COL3的JSON字符串转为字典 ABT["COL3"] = ABT["COL3"].apply(json.loads) # 解析COL3为单独列,与原表横向合并 col3_normalized = pd.json_normalize(ABT["COL3"]) result = pd.concat([ABT, col3_normalized], axis=1)
执行后就能得到你需要的X、y列,同时保留原COL3列。
针对真实数据里的COL6和COL7,处理逻辑完全一致:
# 解析COL7 ABT["COL7"] = ABT["COL7"].apply(json.loads) col7_normalized = pd.json_normalize(ABT["COL7"]) result = pd.concat([result, col7_normalized], axis=1) # 解析嵌套结构的COL6 ABT["COL6"] = ABT["COL6"].apply(json.loads) col6_normalized = pd.json_normalize(ABT["COL6"]) # 简化嵌套列名(去掉前缀paAccounts.) col6_normalized.columns = col6_normalized.columns.str.replace("paAccounts.", "") result = pd.concat([result, col6_normalized], axis=1)
3. 处理COL4(含集合的特殊JSON字符串)
注意:示例中COL4的格式{"A":{1,2}, "B":{3,3}}不是标准JSON(JSON不支持集合类型),json.loads无法解析,需要用ast.literal_eval解析Python字面量:
# 将COL4的字符串转为含集合的Python字典 ABT["COL4"] = ABT["COL4"].apply(literal_eval) # 解析COL4:建议将集合转为列表(集合无序且在DataFrame中处理不友好) col4_normalized = pd.json_normalize(ABT["COL4"]).applymap(lambda x: list(x)) # 合并到结果表 result = pd.concat([result, col4_normalized], axis=1)
COL4的输出形式推荐转为列表(如[1,2]),既能保留去重后的元素,又更适合后续数据处理。
完整代码示例
import pandas as pd import json from ast import literal_eval # 读取数据 ABT = pd.read_excel("ABT.xlsx") # 处理COL3 ABT["COL3"] = ABT["COL3"].apply(json.loads) col3_norm = pd.json_normalize(ABT["COL3"]) # 处理COL4 ABT["COL4"] = ABT["COL4"].apply(literal_eval) col4_norm = pd.json_normalize(ABT["COL4"]).applymap(list) # 合并所有结果 final_result = pd.concat([ABT, col3_norm, col4_norm], axis=1) # 查看结果 print(final_result.head())
内容的提问来源于stack exchange,提问作者dingaro
相关产品推荐
相关产品推荐

