使用pandas json_normalize解析嵌套JSON遇维度不匹配错误求助
嵌套JSON解析:
json_normalize添加元数据触发ValueError的解决 错误原因分析
你遇到的ValueError: operands could not be broadcast together with shape (74607,) (24869,),核心问题是元数据层级匹配错误:
provider_references是negotiated_rates层级下的字段(每个negotiated_rates对象包含自己的provider_references列表),但你调用json_normalize时,将其作为in_network层级的元数据传入。- 当指定
record_path=['negotiated_rates','negotiated_prices']时,pandas会从每个in_network条目里展开所有negotiated_rates下的negotiated_prices,最终得到74607条数据;但in_network层级对应的provider_references只有24869组(每个in_network条目对应一组),两者长度不匹配,无法完成广播对齐,因此报错。
结合你提供的JSON片段来看:每个negotiated_rates对象同时包含provider_references列表和negotiated_prices列表,这两个列表是同层级的关联数据,不能跨层级直接绑定。
解决方法
推荐采用分步展开+关联绑定的方式,确保provider_references和negotiated_prices正确对应:
方法步骤
- 先展开
negotiated_rates,同时保留in_network层级的元数据和negotiated_rates自身的provider_references - 展开
provider_references列表(多值字段拆分) - 展开
negotiated_prices列表,并将其内部字段拆分为独立列 - 最后展开
service_code多值字段
完整代码示例
import gzip import shutil import json import pandas as pd # 解压JSON文件 with gzip.open('testjson.json.gz', 'rb') as f_in: with open('unzipped_json.json', 'wb') as f_out: shutil.copyfileobj(f_in, f_out) # 加载JSON数据 with open('unzipped_json.json') as f: data = json.load(f) # 第一步:展开negotiated_rates,保留关联元数据 negotiated_rates_df = pd.json_normalize( data=data['in_network'], record_path='negotiated_rates', meta=['negotiation_arrangement', 'name', 'billing_code_type', 'billing_code', 'description'] ) # 第二步:展开provider_references列表(每个provider对应一行) negotiated_rates_df = negotiated_rates_df.explode('provider_references').reset_index(drop=True) # 第三步:展开negotiated_prices列表,并拆分内部字段 negotiated_prices_df = negotiated_rates_df.explode('negotiated_prices').reset_index(drop=True) # 将negotiated_prices的字典字段展开为列 negotiated_prices_df = pd.concat( [negotiated_prices_df.drop('negotiated_prices', axis=1), pd.json_normalize(negotiated_prices_df['negotiated_prices'])], axis=1 ) # 第四步:展开service_code多值字段 negotiated_prices_df = negotiated_prices_df.explode('service_code').reset_index(drop=True) # 查看结果 print(negotiated_prices_df.head())
方法优势
- 分步处理避免了跨层级的形状不匹配问题,确保每个
provider_references和对应的negotiated_prices一一关联 - 保留了
in_network层级的所有元数据(如billing_code、description等),满足后续分析需求
内容的提问来源于stack exchange,提问作者user2355903
相关产品推荐
相关产品推荐

