如何将JSON文件中的嵌套对象读取为Pandas DataFrame?
解决嵌套JSON转换为Pandas DataFrame格式异常的问题
原始JSON内容
{ "success":true, "code":"SUCCESS", "data":{ "from":1514745000000, "to":1522175400000, "transactionData":[ {"name":"Recharge & bill payments","paymentInstruments":[{"type":"TOTAL","count":4200,"amount":1845307.4673655091}]}, {"name":"Peer-to-peer payments","paymentInstruments":[{"type":"TOTAL","count":1871,"amount":1.2138655299749982E7}]}, {"name":"Merchant payments","paymentInstruments":[{"type":"TOTAL","count":298,"amount":452507.168646613}]}, {"name":"Financial Services","paymentInstruments":[{"type":"TOTAL","count":33,"amount":10601.419933464953}]}, {"name":"Others","paymentInstruments":[{"type":"TOTAL","count":256,"amount":184689.8662902223}]} ] }, "responseTimestamp":1630501487199 }
问题原因
直接使用pd.read_json('/1.json')读取会得到包含嵌套结构的DataFrame,因为JSON中的transactionData和paymentInstruments都是嵌套数组,无法被自动展开为规整的表格格式。
解决方案
使用pd.json_normalize()处理嵌套JSON,指定需要展开的嵌套路径和保留的上层字段,得到符合预期的表格结构。
基础版代码(仅提取交易核心数据)
import pandas as pd import json # 读取并解析JSON文件 with open('/1.json', 'r') as f: json_data = json.load(f) # 提取核心交易数据列表 transaction_list = json_data['data']['transactionData'] # 展开嵌套结构生成DataFrame df = pd.json_normalize( transaction_list, record_path='paymentInstruments', # 指定要展开的嵌套数组字段 meta=['name'] # 保留上层的交易类型名称字段 ) # 调整列顺序(可选) df = df[['name', 'type', 'count', 'amount']]
执行后得到的规整DataFrame结构示例:
| name | type | count | amount |
|---|---|---|---|
| Recharge & bill payments | TOTAL | 4200 | 1845307.4673655091 |
| Peer-to-peer payments | TOTAL | 1871 | 12138655.29975 |
| Merchant payments | TOTAL | 298 | 452507.168646613 |
| Financial Services | TOTAL | 33 | 10601.419933464953 |
| Others | TOTAL | 256 | 184689.8662902223 |
进阶版代码(包含时间戳字段)
如果需要保留JSON中from和to的时间戳信息,可以将其加入meta参数:
df = pd.json_normalize( transaction_list, record_path='paymentInstruments', meta=['name', ['data', 'from'], ['data', 'to']] ) # 重命名时间戳列以提高可读性 df.rename(columns={ 'data.from': 'from_timestamp', 'data.to': 'to_timestamp' }, inplace=True) # 转换时间戳为可读日期格式(可选) df['from_timestamp'] = pd.to_datetime(df['from_timestamp'], unit='ms') df['to_timestamp'] = pd.to_datetime(df['to_timestamp'], unit='ms')
内容的提问来源于stack exchange,提问作者Akash Kumar
相关产品推荐
相关产品推荐

