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

Pushshift API拉Reddit数据转DataFrame时偶发列不存在报错

报错根因

这个报错的触发原因和列名格式、接口返回结构的一致性完全无关:当你请求的时间窗口内没有匹配的提交数据时,Pushshift返回的data字段会为空列表。此时pd.DataFrame(空列表)会生成一个没有任何列的空DataFrame,后续尝试选取指定的7个字段时,就会抛出“目标列全部不存在于现有列中”的提示。

你可以在本地复现完全一致的报错:

import pandas as pd
empty_df = pd.DataFrame([])
# 执行下面的代码行就会触发和你线上一模一样的报错
empty_df[['author', 'id', 'title', 'score', 'created_utc', 'permalink', 'num_comments']]

112个请求里94次成功、18次失败的原因,就是那18个时间窗口没有被Pushshift索引到的对应子版块帖子,返回了空数据。

修复实现

直接在逻辑里加上空数据判断、列缺失补全的兼容处理即可,修改后的代码如下:

import pandas as pd
import requests 

# 预先定义需要保留的列,避免重复写列表
TARGET_COLS = ['author', 'id', 'title', 'score', 'created_utc', 'permalink', 'num_comments']

for i in reversed(range(2, 113)):
  after_ = i
  before_ = i - 1
  link = f"https://api.pushshift.io/reddit/search/submission/?size=100&before={before_}d&after={after_}d&sort_type=num_comments&sort=desc&subreddit=wallstreetbets"
  path = f"/content/drive/MyDrive/UsersWSB/Posts/days_after_{after_}.csv"
  try:
    resp = requests.get(link, timeout=30)
    sample = resp.json()
    # 第一步:判断返回的data是否为空
    if not sample.get('data'):
      print(f"after={after_}d 对应的时间区间无有效返回数据,跳过")
      continue
    df = pd.DataFrame(sample['data'])
    # 第二步:兼容单条数据缺列的场景,缺失的列用空值填充
    for col in TARGET_COLS:
        if col not in df.columns:
            df[col] = pd.NA
    # 第三步:选取需要的列后保存
    df = df[TARGET_COLS]
    df.to_csv(path)
  except Exception as e:
    print(f"after={after_}d 处理失败,错误:{e}")
可选优化建议
  • 给请求增加1-2次重试逻辑,应对Pushshift接口偶发的服务端超时、限流问题
  • 空数据的场景可以生成仅包含目标列的空CSV文件,保持所有输出文件的结构一致,方便后续统一拼接处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 16:06:01