You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:14:15