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

如何从JSON中提取指定字段构建Pandas DataFrame?

如何从嵌套JSON响应中提取指定字段构建Pandas DataFrame

我用requests调用接口获取JSON响应:

response = requests.get(endpoint, auth=(user_name, api_key)).json()

响应结构如下:

{'SalesInfoStatus': {'next_offset': 15,
  'sales': [{'saSalesID': '761S-1666031549-adhoc-0:0',
    'identifier': '761',
    'origin': 'New York',
    'destination': 'London',
    'filed_time': {'epoch': 1666033349,
     'time': '15:02',
     'date': '10/19/2022',
     'localtime': 1666018949},
     'actual_time': {'epoch': 1666033349,
     'time': '15:02',
     'date': '10/19/2022',
     'localtime': 1666018949},
    'inbound_saSalesID': '761S-1666029229-adhoc-0:0'},
   {'saSalesID': '762S-1666031549-adhoc-0:0',
    'identifier': '762',
    'origin': 'New York',
    'destination': 'London',
    'filed_time': {'epoch': 1666033349,
     'time': '15:02',
     'date': '10/17/2022',
     'localtime': 1666018949},
     'actual_time': {'epoch': 1666033349,
     'time': '15:02',
     'date': '10/17/2022',
     'localtime': 1666018949},
    'inbound_saSalesID': '762S-1666029229-adhoc-0:0'},
   {'saSalesID': '765S-1666031549-adhoc-0:0',
    'identifier': '765',
    'origin': 'Paris',
    'destination': 'Tokyo',
    'filed_time': {'epoch': 1666033349,
     'time': '15:02',
     'date': '10/15/2022',
     'localtime': 1666018949},
     'actual_time': {'epoch': 1666033349,
     'time': '15:02',
     'date': '10/15/2022',
     'localtime': 1666018949},
    'inbound_saSalesID': '765S-1666029229-adhoc-0:0'},
   {'saSalesID': '767S-1666031549-adhoc-0:0',
    'identifier': '767',
    'origin': 'Los Angeles',
    'destination': 'Sydney',
    'filed_time': {'epoch': 1666033349,
     'time': '15:02',
     'date': '10/13/2022',
     'localtime': 1666018949},
     'actual_time': {'epoch': 1666033349,
     'time': '15:02',
     'date': '10/13/2022',
     'localtime': 1666018949},
    'inbound_saSalesID': '767S-1666029229-adhoc-0:0'}
]}}

type(response)返回dict类型。我想要构建包含date、origin、destination和identifier字段的Pandas DataFrame,预期结果如下:

date         origin          destination     identifier
10/19/22     New York        London          761
10/17/22     New York        London          762
10/15/22     Paris           Tokyo           765
10/13/22     Los Angeles     Sydney          767

我尝试了:

df = pd.json_normalize(response)

但返回的DataFrame包含嵌套JSON列:

SalesInfoStatus
    sales          [{'saSalesID': '761S-1666031549-adhoc-0:0',... 
    next_offset    15                                  

请问怎么把指定字段拆分到独立列中?


解决方案

方法1:定位嵌套数组后使用json_normalize

你需要先定位到response['SalesInfoStatus']['sales']这个核心数组,再对它进行归一化处理,最后提取需要的字段:

import pandas as pd

# 直接对sales数组做JSON归一化
df = pd.json_normalize(response['SalesInfoStatus']['sales'])

# 提取目标字段并重命名date列
result_df = df[['filed_time.date', 'origin', 'destination', 'identifier']].rename(
    columns={'filed_time.date': 'date'}
)

# 可选:将日期格式从"10/19/2022"转为"10/19/22"
result_df['date'] = result_df['date'].str[-5:]

方法2:手动遍历字典构建数据列表

如果需要更灵活的自定义处理,可以手动遍历sales数组,逐个提取字段:

import pandas as pd

sales_data = []
for item in response['SalesInfoStatus']['sales']:
    sales_data.append({
        'date': item['filed_time']['date'][-5:],  # 截取日期后5位得到短格式
        'origin': item['origin'],
        'destination': item['destination'],
        'identifier': item['identifier']
    })

result_df = pd.DataFrame(sales_data)

说明

  • 两种方法都能得到预期结果:第一种利用Pandas内置方法更简洁,第二种手动遍历适合需要额外字段处理的场景。
  • 注意date字段的来源,示例中用的是filed_time.date,如果实际需要actual_time.date,替换对应的键即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:05:22