pandas中如何将列表型JSON列解析为目标多列并关联对应ID
报错根因
你的代码存在三类直接触发异常的问题:
- 导入语句存在语法错误,模块、对象顺序写反,代码启动阶段就会抛语法异常
- 列操作逻辑错误:
pop('TypeValues')是DataFrame的列删除方法,你先通过data['TypeValues']取出了Series对象,再在Series上调用pop找同名列完全无效 - 前置解析缺失:CSV读入后
TypeValues列默认是字符串格式,你没有先把字符串格式的嵌套列表/JSON转成Python原生的列表、字典对象,直接传入pd.DataFrame()构造器就会触发DataFrame constructor not properly called!报错;对空值、已解析为列表的非字符串对象调用eval(),自然会触发eval() arg 1 must be a string, bytes or code object的参数类型错误。
处理方案
以下代码兼容空列表、空值场景,拆分后自动关联ID列,无安全风险:
import numpy as np import pandas as pd import ast from pathlib import Path # pandas 1.0+版本可直接用pd.json_normalize,低版本用下一行导入 from pandas.io.json import json_normalize # 读取源文件 data = pd.read_csv('Test.csv') # 安全解析TypeValues列,统一处理空值、空列表、异常格式 def parse_nested_content(x): if pd.isna(x): return [] if isinstance(x, list): return x try: parsed_res = ast.literal_eval(x) return parsed_res if isinstance(parsed_res, list) else [] except: return [] data['parsed_col'] = data['TypeValues'].apply(parse_nested_content) # 过滤有效数据行,保留索引用于后续对齐 valid_rows = data[data['parsed_col'].map(len) > 0] # 批量展开嵌套结构,保留原索引做关联 expanded_cols = pd.concat( [json_normalize(row_data) for row_data in valid_rows['parsed_col']], keys=valid_rows.index ).reset_index(level=1, drop=True) # 关联ID列,空值/空列表行的拆分字段自动填充NaN final_df = data[['ID']].join(expanded_cols)
说明
- 用
ast.literal_eval替代原生eval做解析,不会执行字符串里的恶意代码,安全性更高 - 如果单条
TypeValues数据的列表里只有1个JSON对象,拆分后会刚好生成你需要的4列,和ID一一对应;如果单条列表包含多个JSON对象,会自动生成同一个ID对应多行的一对多结构 - 空值、空列表、格式异常的行不会中断运行,拆分后的字段默认填充
NaN,可根据后续需求自行选择删除或填充
内容的提问来源于stack exchange,提问作者Usman Janjua
相关产品推荐
相关产品推荐

