读取字段长度不一致的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
相关产品推荐
相关产品推荐

