Python:嵌套JSON转Dataframe及大文件指定字段提取求助
Hey there! 看到你在处理250MB的在线PET类JSON文件,需要提取series_id、data数组中的日期(第一个元素)和数值(第二个元素)并转成DataFrame,刚好我有几个实用的方案分享给你,比单纯循环处理要高效得多:
方案1:流式解析(内存友好,适合大文件)
如果你的机器内存不算特别充裕,或者想避免一次性加载250MB文件带来的内存压力,推荐用ijson做流式解析,配合requests的流式下载,边下载边处理:
首先安装依赖:
pip install ijson requests pandas
然后是代码实现:
import ijson import requests import pandas as pd # 替换成你要处理的PET文件的在线URL pet_url = "你的PET文件URL" # 开启流式请求,避免一次性下载整个大文件 with requests.get(pet_url, stream=True) as response: response.raise_for_status() records = [] # 流式遍历JSON数组中的每一个series对象 for series_item in ijson.items(response.raw, 'item'): current_series_id = series_item.get('series_id') # 遍历当前series下的所有data条目 for date_str, value in series_item.get('data', []): records.append({ 'series_id': current_series_id, 'date': date_str, 'value': value }) # 转换为DataFrame final_df = pd.DataFrame(records)
这个方案的优势是内存占用极低,不会把整个250MB的JSON文件加载到内存里,而是逐个解析每个series对象,处理完就丢弃,非常适合大文件场景。
方案2:一次性加载+Pandas内置函数(代码简洁,适合内存充足的场景)
如果你的机器内存足够(250MB的JSON加载到内存其实占用会稍高,但大部分现代机器都能轻松应对),可以用Pandas的json_normalize和explode来快速处理,代码更简洁:
import requests import pandas as pd pet_url = "你的PET文件URL" response = requests.get(pet_url) response.raise_for_status() raw_data = response.json() # 先提取核心的series_id和data字段 temp_df = pd.json_normalize(raw_data)[['series_id', 'data']] # 把每个series对应的data数组展开成单独行 expanded_df = temp_df.explode('data', ignore_index=True) # 将data列的数组拆分成date和value两个独立列 expanded_df[['date', 'value']] = pd.DataFrame(expanded_df['data'].tolist(), index=expanded_df.index) # 移除不再需要的原始data列 final_df = expanded_df.drop('data', axis=1)
这个方案代码量少,可读性高,处理速度也很快,适合内存充足的场景。
额外优化建议
- 提前下载文件:如果需要多次处理这个文件,建议先把它下载到本地,避免重复发起网络请求:
with open('pet_data.json', 'wb') as f: f.write(requests.get(pet_url).content) # 后续直接读取本地文件 with open('pet_data.json', 'rb') as f: # 用方案1或方案2的方式处理本地文件即可 - 数据类型转换:提取后可以把日期转成datetime类型,数值转成数值类型,方便后续分析:
final_df['date'] = pd.to_datetime(final_df['date']) final_df['value'] = pd.to_numeric(final_df['value'], errors='coerce') - 错误处理:可以给
get方法加上默认值,避免某些字段缺失导致报错,比如series_item.get('series_id', 'unknown')。
内容的提问来源于stack exchange,提问作者GuyzmoFR
相关产品推荐
相关产品推荐

