Python pandas嵌套for循环无限运行但结果正常生成问题排查
问题原因
代码出现长时间无响应(看似无限运行)的核心原因是重复计算+低效遍历,没有利用pandas的向量化特性,计算量被无意义放大:
- 提取唯一分类的代码中,你每次循环都调用
dft['listed_in'].str.split(','),每调用一次就会对全量数据做一次字符串拆分,假设数据集有N行,你就重复做了N次完全相同的拆分操作;再加上用列表做in判断的时间复杂度随分类数量线性上涨,数据量稍大就会极慢。 - 统计频次的代码除了重复触发全列split的问题,还存在逻辑错误:你取的是split结果的
index和value_counts(),根本不是单条作品对应的分类标签,等于判断和计数逻辑从根上就错了。另外硬编码的65、514两个循环边界没有通用性,数据变动就会触发索引报错。
高效实现方案
不需要写双层for循环,pandas原生方法可以在毫秒级完成需求,全程只需要做一次字符串拆分:
- 一次性拆分所有分类,避免重复计算
# 仅做一次全列拆分,结果存为变量复用 split_tags = dft['listed_in'].str.split(',')
- 提取唯一分类列表
# 展平所有标签、去重,顺便清理标签前后的空格/多余引号 genres = list({tag.strip().strip("'") for tags in split_tags for tag in tags})
- 统计每个分类的出现次数
直接用explode把每行的多标签拆成独立行,再做值计数即可,不需要手动遍历累加:
gnr = split_tags.explode()\ .str.strip()\ .str.strip("'")\ .value_counts()\ .reset_index() gnr.columns = ['Genres', 'count']
额外提示:如果你原始的
listed_in列里分类之间除了逗号还有空格,记得用strip()清理前后空白,否则像"Documentary"和" Documentary"会被识别成两个不同分类,导致统计结果不准。
内容的提问来源于stack exchange,提问作者Aniruddh
相关产品推荐
相关产品推荐

