如何将无表头嵌套JSON读入Pandas并设置自定义表头
处理无表头嵌套JSON转Pandas DataFrame
这种没有明确表头的嵌套JSON确实容易让人卡壳,毕竟常规的pd.read_json直接用的话根本达不到你要的结构。我来给你两种解决方案,分别对应拆分多行和合并郊区的需求~
首先先明确下你提到的JSON结构示例(方便对应代码):
{ "2023-10-01": { "Main St": ["Downtown", "West End"], "Oak Ave": ["Riverdale"] }, "2023-10-02": { "Maple Rd": ["North Park", "South Hill"] } }
方案1:将多郊区拆分为单独行(推荐,符合常规数据分析结构)
这个方案会把每个郊区都生成一行数据,完美匹配你要的date、street、suburb三列结构:
import pandas as pd import json # 读取本地JSON文件 with open('your_file.json', 'r') as f: json_data = json.load(f) # 逐层遍历嵌套结构,整理成DataFrame需要的行数据 formatted_rows = [] for date_str, street_dict in json_data.items(): for street_name, suburb_list in street_dict.items(): # 遍历每个郊区,生成单独的记录 for suburb in suburb_list: formatted_rows.append({ 'date': date_str, 'street': street_name, 'suburb': suburb }) # 转换为DataFrame df = pd.DataFrame(formatted_rows) print(df)
运行后输出的DataFrame结构:
| date | street | suburb |
|---|---|---|
| 2023-10-01 | Main St | Downtown |
| 2023-10-01 | Main St | West End |
| 2023-10-01 | Oak Ave | Riverdale |
| 2023-10-02 | Maple Rd | North Park |
| 2023-10-02 | Maple Rd | South Hill |
如果你的JSON数据量很大,用列表推导式会更高效,等价的写法:
formatted_rows = [ {'date': d, 'street': s, 'suburb': sb} for d, streets in json_data.items() for s, subs in streets.items() for sb in subs ] df = pd.DataFrame(formatted_rows)
方案2:将多郊区合并为单个单元格
如果你的需求是把同一条街道的郊区合并成一个字符串(比如用逗号分隔),可以用这个方案:
import pandas as pd import json with open('your_file.json', 'r') as f: json_data = json.load(f) formatted_rows = [] for date_str, street_dict in json_data.items(): for street_name, suburb_list in street_dict.items(): # 把郊区列表合并为逗号分隔的字符串 merged_suburbs = ', '.join(suburb_list) formatted_rows.append({ 'date': date_str, 'street': street_name, 'suburb': merged_suburbs }) df = pd.DataFrame(formatted_rows) print(df)
运行后输出的DataFrame结构:
| date | street | suburb |
|---|---|---|
| 2023-10-01 | Main St | Downtown, West End |
| 2023-10-01 | Oak Ave | Riverdale |
| 2023-10-02 | Maple Rd | North Park, South Hill |
小提示
- 记得把代码里的
your_file.json替换成你实际的文件路径 - 如果你的JSON数据不是本地文件,而是API返回的字符串,直接用
json.loads(response_text)解析就行,不用文件读取那一步
内容的提问来源于stack exchange,提问作者AshHimself
相关产品推荐
相关产品推荐

