Python中如何高效删除DataFrame大量非英文行,有没有替代df.drop的方法?
高效删除DataFrame中非英文推文的方案
你当前的实现耗时很高有两个核心原因:
- 代码本身存在逻辑缺陷:缺少遍历DataFrame行的外层循环,变量
i未定义就直接使用 - 最大的性能瓶颈是循环调用
df.drop():Pandas的drop操作每次都会生成完整的DataFrame副本,循环执行n次的时间复杂度为O(n²),数据量越大耗时增长越快
最优解决方案:布尔掩码筛选
Pandas中最高效的行过滤方式是直接生成布尔掩码保留符合要求的行,无需删除操作,时间复杂度仅为O(n),比批量drop还要快3~10倍,修正后的代码如下:
def filter_english_tweets(df): def is_english(text): try: # 仅保留英文推文 return langid.classify(text)[0] == 'en' except ValueError: # 分类出错的推文也直接过滤 return False # 生成筛选掩码 en_mask = df['tweet'].apply(is_english) # 单次筛选得到结果,无需反复操作原数据 return df[en_mask].reset_index(drop=True) # 调用示例 newDf = filter_english_tweets(beforeClassification(inputDf))
其他可选优化点
- 如果一定要用
drop实现,不要循环传入单个索引,直接把所有待删除索引的列表一次性传给drop即可:df.drop(rowsToDelete, inplace=True),性能比循环drop高很多,但仍低于布尔筛选 - 超大数据量下可以提前预加载langid分类器,或者用多进程并行执行分类逻辑,进一步缩短耗时
内容的提问来源于stack exchange,提问作者user16895885
相关产品推荐
相关产品推荐

