如何将pandas嵌套JSON中Quotes字段转换为DataFrame?
嵌套JSON转pandas DataFrame解决方案
你之前代码的错误点:json_normalize的第三个参数meta用于指定JSON顶层需要同步附加到每行的字段,而QuoteId、MinPrice等本身就是Quotes数组内的子字段,不需要在meta中声明,json_normalize处理数组时会自动提取这些同级字段。
基础实现(仅提取Quotes数组为DataFrame)
直接将Quotes数组传入json_normalize即可,嵌套的OutboundLeg字段会被自动展开:
import pandas as pd import json # 读取本地JSON文件 with open('myJson.json', encoding='utf-8') as data_file: data = json.load(data_file) # 规范化Quotes数组为DataFrame df = pd.json_normalize(data['Quotes'])
运行后得到的DataFrame默认包含以下列:
- QuoteId
- MinPrice
- Direct
- QuoteDateTime
- OutboundLeg.CarrierIds
- OutboundLeg.OriginId
- OutboundLeg.DestinationId
- OutboundLeg.DepartureDate
如果需要移除列名中的OutboundLeg.前缀,可执行以下代码:
df.columns = df.columns.str.replace('OutboundLeg.', '', regex=False)
进阶实现(关联映射表补全业务字段)
原始JSON中还包含Carriers、Places等映射表,可通过字典映射把ID替换为可读的业务名称:
# 构造航空公司ID到名称的映射字典 carrier_map = {item['CarrierId']: item['Name'] for item in data['Carriers']} # 构造地点ID到名称的映射字典 place_map = {item['PlaceId']: item['Name'] for item in data['Places']} # 补全航空公司、出发地、目的地名称 df['CarrierName'] = df['OutboundLeg.CarrierIds'].apply(lambda x: carrier_map[x[0]]) df['OriginName'] = df['OutboundLeg.OriginId'].map(place_map) df['DestinationName'] = df['OutboundLeg.DestinationId'].map(place_map)
内容的提问来源于stack exchange,提问作者user4933
相关产品推荐
相关产品推荐

