如何从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
相关产品推荐
相关产品推荐

