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

读取字段长度不一致的TSV文件触发pandas.ParserError问题求助(目标:统计数据集边数)

解决pandas读取不规则TSV的解析错误并统计边数

这个问题我太熟了!你遇到的ParserError完全是因为你的TSV文件每行的字段数量不一致——第一行是3个(演员ID+1个电影ID),第二行是5个(演员ID+3个电影ID),第三行是6个(演员ID+5个电影ID),而pandas默认的C解析器要求所有行的列数必须相同,所以直接触发了错误。

第一步:正确读取不规则列数的TSV文件

我们需要切换到Python引擎来读取文件,它支持每行列数不同的情况。另外,考虑到你的示例里是空格分隔(可能你说的TSV其实是空白分隔的文件),可以用sep='\s+'来匹配任意空白字符(包括制表符和空格):

import pandas as pd

# 读取文件,允许不规则列数,使用Python引擎
df = pd.read_csv(
    filename,
    sep='\s+',  # 匹配任意空白(制表符/空格)
    header=None,
    engine='python'
)

第二步:统计边数

你的目标是统计演员和电影之间的边数——也就是每个演员和他对应的每部电影都算一条边。我们可以用explode方法把每行的电影ID拆成单独的行,然后直接统计行数即可:

# 将每行从第二列开始的电影ID转为列表(过滤空值)
df['movie_ids'] = df.iloc[:, 1:].apply(lambda row: row.dropna().tolist(), axis=1)

# 把列表中的每个电影ID拆成单独一行
exploded_df = df.explode('movie_ids')

# 总边数就是爆炸后的行数
total_edges = len(exploded_df)
print(f"数据集中的总边数:{total_edges}")

如果你想更直观地看到所有边,可以打印exploded_df的前几行:

print(exploded_df[[0, 'movie_ids']].head())

替代方案(纯遍历统计)

如果不想用explode,也可以直接遍历每行统计:

total_edges = 0
for _, row in df.iterrows():
    # 第一列是演员ID,后面的都是电影ID,过滤掉空值后统计数量
    movie_count = len(row[1:].dropna())
    total_edges += movie_count
print(f"总边数:{total_edges}")

两种方法得到的结果是一样的,explode更符合pandas的风格,遍历法则更直观易懂。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 19:18:12