You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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正确对应:

方法步骤

  1. 先展开negotiated_rates,同时保留in_network层级的元数据和negotiated_rates自身的provider_references
  2. 展开provider_references列表(多值字段拆分)
  3. 展开negotiated_prices列表,并将其内部字段拆分为独立列
  4. 最后展开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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 06:48:25