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

pandas.json_normalize中record_path参数行为不一致原因及解决

解决pd.json_normalize的record_path参数问题

先给你能得到目标结果的两种可行写法:

方法一:先标准化再筛选列

这是最直观的方式,先用你已经成功的代码生成完整DataFrame,再提取需要的列:

import pandas as pd

json_input = {
    'Data': {
        '_type': 'Forecast',
        'BaseUrl': {'_forServiceTimeFormat': 'time', '$': 'http://example.com/'},
        'Class': [
            {'_displayName': 'Rainfall', 'Service': {'_name': 'ServiceName', 'ClassName': '_Precipitation_Rate', 'ImageFormat': 'jpg', 'times': {'_defaultTime': '2023-09-19T12:00:00', 'time': [1,5,10,15,20,25,30,35,40,45,50]}}},
            {'_displayName': 'Cloud', 'Service': {'_name': 'ServiceName', 'ClassName': '_Total_Cloud_Cover', 'ImageFormat': 'gif', 'times': {'_defaultTime': '2023-09-19T15:30:00', 'time': [2,6,12,18,24,30,36,42,48,54,60]}}}
        ]
    }
}

df = pd.json_normalize(json_input['Data'], ['Class'])
result_df = df[['Service.times._defaultTime']]
print(result_df)

输出完全符合你的期望:

Service.times._defaultTime
0        2023-09-19T12:00:00
1        2023-09-19T15:30:00

方法二:一步到位指定提取字段

如果想直接通过normalize生成目标结果,可以用meta参数指定要提取的嵌套字段,record_path保持指向生成行的列表(即['Class']):

result_df = pd.json_normalize(
    json_input['Data'],
    record_path=['Class'],
    meta=[['Service', 'times', '_defaultTime']]
)
# 重命名列名匹配需求
result_df.columns = ['Service.times._defaultTime']
print(result_df)

关于record_path参数的清晰解释

record_path的核心作用只有一个:告诉pandas从哪个嵌套的列表结构里生成DataFrame的每一行。它的路径必须最终指向一个列表,路径上的每一级,要么是能定位到列表的键,要么是列表本身。

你之前用['Class', 'Service', 'times']报错的原因很明确:

  • Class是列表(没问题,这是生成行的基础)
  • 但Service是字典,不是列表,pandas无法从字典里拆分出新的行
  • times同样是字典,不符合record_path必须指向列表的要求

简单总结:record_path里的每一段,都要对应到一个列表,这样pandas才能把列表里的每个元素拆成一行。如果路径走到了字典,就会触发报错,因为字典无法被拆分成多行结构。

内容的提问来源于stack exchange,提问作者VERBOSE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 17:17:27