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

读取亚马逊QA数据集json.gzip文件至DataFrame时出现ValueError问题求助

解决pandas读取亚马逊QA数据集时的ValueError问题

我之前也碰过类似的情况,咱们来一步步拆解问题:

问题回顾

你尝试读取亚马逊Electronics分类的QA数据集,用pd.read_json()时一直抛出ValueError: Expected object or value,试过调整orient参数、本地打开文件都没解决,代码大概是这样:

electronics_url = 'http://jmcauley.ucsd.edu/data/amazon/qa/qa_Electronics.json.gz'
electronics_df = pd.read_json(electronics_url, orient='split', lines=True, compression='gzip')

核心错误原因

  1. JSON格式不标准:你给出的样本数据里,字典用的是单引号,但JSON规范要求必须用双引号。pd.read_json()是严格遵循JSON标准的,所以这种单引号的结构会被判定为无效格式,直接解析失败。
  2. orient参数误用:orient='split'是用来处理特定结构的JSON(比如包含columns、data、index三个键的拆分式结构),但这个QA数据集是每行一个独立的字典对象,完全不匹配这个参数的使用场景。

解决方案:手动处理非标准JSON

因为数据集的格式不符合严格JSON规范,我们需要先逐行读取,把单引号替换成双引号,再解析成字典后转成DataFrame。这里给你两种可行的方法:

方法一:在线流式处理(无需下载文件)

用requests获取文件流,配合gzip模块解压,逐行处理格式后解析:

import requests
import gzip
import pandas as pd
import json

url = 'http://jmcauley.ucsd.edu/data/amazon/qa/qa_Electronics.json.gz'

response = requests.get(url, stream=True)
data_records = []

# 流式读取并解压文件
with gzip.GzipFile(fileobj=response.raw) as gz_file:
    for line in gz_file:
        # 把单引号替换为双引号,符合JSON标准
        formatted_line = line.decode('utf-8').replace("'", '"')
        try:
            # 解析为字典并加入列表
            record = json.loads(formatted_line)
            data_records.append(record)
        except json.JSONDecodeError as e:
            print(f"跳过解析失败的行: {formatted_line[:50]}... 错误: {e}")

# 转成DataFrame
electronics_df = pd.DataFrame(data_records)

方法二:本地文件处理(先下载到本地)

如果你已经把文件下载到本地,可以用gzip直接读取本地文件:

import gzip
import pandas as pd
import json

local_path = 'qa_Electronics.json.gz'  # 你的本地文件路径
data_records = []

with gzip.open(local_path, 'rt', encoding='utf-8') as gz_file:
    for line in gz_file:
        formatted_line = line.replace("'", '"')
        try:
            record = json.loads(formatted_line)
            data_records.append(record)
        except json.JSONDecodeError as e:
            print(f"跳过解析失败的行: {formatted_line[:50]}... 错误: {e}")

electronics_df = pd.DataFrame(data_records)

验证结果

运行完上面的代码后,你可以用electronics_df.head()查看前几行数据,应该能正确识别所有字段:questionType、asin、answerTime、unixTime、question、answerType、answer。

内容的提问来源于stack exchange,提问作者Filip Szczybura

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 12:57:34