Python实现多层嵌套字典JSON转指定结构DataFrame
多层嵌套JSON转指定结构DataFrame实现方案
该JSON嵌套层级固定,直接逐层遍历提取字段即可,无需复杂通用递归逻辑,执行效率高且不会出现字段错位问题。
依赖准备
仅需安装pandas库,执行以下命令安装:pip install pandas
完整可运行代码
import json import pandas as pd # 从本地JSON文件读取数据时放开下方注释,替换为实际文件路径 # with open("your_data.json", "r", encoding="utf-8") as f: # raw_data = json.load(f) # 此处使用提问中提供的样例数据做演示 raw_data = { "last_scanned_block": 14968718, "blocks": { "13965799": { "0x9603846aff5c425277e483de16179a68dbc739debcc5449ea99e45c9d0924430": { "165": { "from": "0x0000000000000000000000000000000000000000", "to": "0x01f87c337be5636Cd9B3D48F1159768A7e7837A5", "value": 100000000000000000000000000, "timestamp": "2022-01-08T16:19:02" } } }, "13965820": { "0xd4a4122734a522c40504c8b0ab43b9aa40ac821cd9913179b3ae64e5b166fc57": { "226": { "from": "0x01f87c337be5636Cd9B3D48F1159768A7e7837A5", "to": "0xEa3Fa123Eb40CEEaeED390D8d6dE6AF95f044AF7", "value": 610000000000000000000000, "timestamp": "2022-01-08T16:25:12" } } } } } result_rows = [] last_scanned_block_val = raw_data["last_scanned_block"] # 逐层遍历嵌套结构 for block_id, tx_hash_map in raw_data["blocks"].items(): for tx_hash, num_map in tx_hash_map.items(): for tx_num, tx_detail in num_map.items(): single_row = { "Last_scanned_block": last_scanned_block_val, "block": block_id, "hex": tx_hash, "number": int(tx_num), "from": tx_detail["from"], "to": tx_detail["to"], "value": tx_detail["value"], "timestamp": tx_detail["timestamp"] } result_rows.append(single_row) # 生成DataFrame并固定列顺序 df = pd.DataFrame( result_rows, columns=["Last_scanned_block", "block", "hex", "number", "from", "to", "value", "timestamp"] ) # 打印验证结果 print(df)
运行效果
代码执行后生成的DataFrame完全匹配要求的8个字段,第一行取值与提问中给出的示例完全一致,样例数据运行后输出如下:
| Last_scanned_block | block | hex | number | from | to | value | timestamp |
|---|---|---|---|---|---|---|---|
| 14968718 | 13965799 | 0x9603846aff5c425277e483de16179a68dbc739debcc5449ea99e45c9d0924430 | 165 | 0x0000000000000000000000000000000000000000 | 0x01f87c337be5636Cd9B3D48F1159768A7e7837A5 | 100000000000000000000000000 | 2022-01-08T16:19:02 |
| 14968718 | 13965820 | 0xd4a4122734a522c40504c8b0ab43b9aa40ac821cd9913179b3ae64e5b166fc57 | 226 | 0x01f87c337be5636Cd9B3D48F1159768A7e7837A5 | 0xEa3Fa123Eb40CEEaeED390D8d6dE6AF95f044AF7 | 610000000000000000000000 | 2022-01-08T16:25:12 |
可选调整
- 若需要保留
number字段为字符串类型,删除代码中int(tx_num)的int()转换即可 - 若需要调整列顺序,修改
pd.DataFrame参数中columns列表的元素顺序即可 - 若后续JSON嵌套层级发生变动,对应增减遍历循环的层数即可
- 大数据量场景下,当前采用的「先攒列表再转DataFrame」的方式,比逐行追加DataFrame的执行效率高1~2个数量级
内容的提问来源于stack exchange,提问作者user9901718
相关产品推荐
相关产品推荐

