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

Pandas解析IMDB数据时出现位置溢出错误如何解决?

处理IMDB数据集时的runtimeMinutes解析问题及解决方法

问题背景

用Pandas处理IMDB的title.basics.tsv文件,尝试将runtimeMinutes列解析为"Int64"类型时,出现以下错误:

ValueError: Unable to parse string "Reality-TV" at position 47993

但检查报错提示的第47994行及相邻行,根本找不到Reality-TV这个字符串;删除文件开头的47994条数据后,报错位置变成了65535,怀疑是uint16变量溢出导致报错位置不准,需要解决解析错误并定位真正的问题行。

使用的代码如下:

titles = pd.read_csv("title.basics.tsv",
                     sep="\t",
                     dtype={
                         "runtimeMinutes": "Int64",
                     },
                     na_values={
                         "runtimeMinutes": ["\\N"],
                     })

解决步骤

1. 定位真正的错误行

直接指定dtype会让Pandas在解析时提前报错,且行号不准,所以先不限制类型,读取后排查异常值:

方法一:全量读取后筛选

# 先读取全部数据,不指定runtimeMinutes的类型
titles = pd.read_csv("title.basics.tsv", sep="\t", na_values=["\\N"])

# 找出runtimeMinutes列中不是纯数字的行(排除缺失值)
invalid_rows = titles[~titles["runtimeMinutes"].astype(str).str.match(r'^\d+$', na=False)]

# 查看错误行的关键信息
print(invalid_rows[["tconst", "titleType", "primaryTitle", "runtimeMinutes"]])

运行后就能直接看到所有包含非数字内容(比如Reality-TV)的行,不用管报错的虚假位置。

方法二:分块读取(适合超大文件)

如果文件太大全量读取内存不够,用分块逐步排查:

chunk_size = 100000  # 每次读10万行
for chunk_idx, chunk in enumerate(pd.read_csv("title.basics.tsv", sep="\t", na_values=["\\N"], chunksize=chunk_size)):
    # 筛选当前块中的错误行
    invalid = chunk[~chunk["runtimeMinutes"].astype(str).str.match(r'^\d+$', na=False)]
    if not invalid.empty:
        print(f"在第 {chunk_idx*chunk_size + 1} 到 {(chunk_idx+1)*chunk_size} 行中找到错误行:")
        print(invalid[["tconst", "runtimeMinutes"]])

2. 解决解析错误

找到错误行后,有两种方式处理,避免后续解析报错:

方式一:读取时自定义转换函数

用converters参数提前处理非数字值,直接转为缺失值:

def parse_runtime(s):
    # 处理缺失值或非数字内容
    if s == "\\N" or not s.strip().isdigit():
        return pd.NA
    return int(s)

titles = pd.read_csv("title.basics.tsv",
                     sep="\t",
                     converters={"runtimeMinutes": parse_runtime},
                     dtype={"runtimeMinutes": "Int64"})

方式二:先读取再转换

先读取为普通类型,清洗后再转成Int64:

titles = pd.read_csv("title.basics.tsv", sep="\t", na_values=["\\N"])
# 把无法转成数字的内容强制转为缺失值,再转Int64类型
titles["runtimeMinutes"] = pd.to_numeric(titles["runtimeMinutes"], errors="coerce").astype("Int64")

关于报错位置偏移的原因

你的猜测是对的:Pandas解析大文件时,内部用uint16记录行号,而uint16的最大值是65535,当行号超过这个值就会溢出,导致报错显示的位置和实际行号不匹配。所以跳过强制类型读取,先排查异常值是最直接的解决办法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 11:45:08