pd.json_normalize因meta含空列表列致维度不匹配ValueError的解决方法
解决pandas json_normalize中meta包含空列表导致的广播错误
问题描述
尝试将嵌套字典列表转换为DataFrame时,使用以下代码:
meta=['column1', 'column2','column3', 'column4', 'column5', 'column6', 'column7', 'column8'] df = pd.json_normalize(json_result[0][0:198], record_path=['column9'], meta = meta[0:10][0:198] )
当meta包含column7和column8(对应值为空列表)时,触发报错:
ValueError: operands could not be broadcast together with shape (0,) (198,)
移除这两个空列表字段后程序运行正常,需解决该错误。
解决方案
报错核心原因是空列表类型的meta字段长度(0)与record_path展开后的行数(198)无法对齐广播,可通过以下两种方式解决:
1. 动态过滤空列表的meta字段
在传入meta参数前,剔除那些对应值为空列表的字段,确保所有meta字段的长度与目标数据行数匹配:
# 过滤meta中对应值为空列表的字段 filtered_meta = [ col for col in meta if any(len(item.get(col, [])) > 0 for item in json_result[0][0:198]) ] # 调用json_normalize df = pd.json_normalize(json_result[0][0:198], record_path=['column9'], meta=filtered_meta)
若明确知道哪些字段是空列表,也可直接手动过滤:
filtered_meta = [col for col in meta if col not in ['column7', 'column8']]
2. 将空列表替换为单个空值(保留字段)
如果需要保留column7和column8字段,可将原数据中的空列表替换为None(或其他单个空值),让字段长度与目标行数匹配:
# 遍历数据,替换空列表为None for item in json_result[0][0:198]: for col in ['column7', 'column8']: if isinstance(item.get(col), list) and len(item[col]) == 0: item[col] = None # 正常调用json_normalize df = pd.json_normalize(json_result[0][0:198], record_path=['column9'], meta=meta)
内容的提问来源于stack exchange,提问作者Raghu
相关产品推荐
相关产品推荐

