如何在Pandas中高效删除PHRASE列含'___'的行?
高效删除DataFrame中含特定模式的行
原代码的问题
- 循环遍历效率极低:Pandas的核心优势是矢量化运算,逐行循环处理200万条数据会导致耗时剧增,完全违背了Pandas的设计初衷。
append操作错误且低效:df.append()不会修改原DataFrame,你没有将返回值重新赋值给df_clean,等于白操作;而且每次append都会创建新的DataFrame对象,频繁累加会带来巨大的内存和性能开销。- 计数逻辑冗余:手动遍历计数完全没必要,用DataFrame的长度差就能直接算出结果。
高效解决方案(两种可选)
方法1:固定字符串匹配(推荐,最快)
因为你要匹配的是固定的"___",直接用str.contains做矢量化筛选,性能最优:
# 筛选出PHRASE列不含"___"的所有行 df_clean = df_original[~df_original["PHRASE"].str.contains("___", na=False)] # 统计被删除的行数(含"___"的记录数) deleted_count = len(df_original) - len(df_clean) # 统计保留的行数 kept_count = len(df_clean)
~符号表示取反,筛选出不满足"包含___"条件的行na=False用来处理PHRASE列可能存在的空值(NaN),避免这些行被错误过滤或报错- 矢量化操作直接在整列上批量处理,百万级数据几秒就能完成
方法2:正则匹配(适配复杂模式)
如果以后需要匹配更复杂的正则规则(比如不确定下划线数量的情况),可以结合正则表达式:
import re # 编译正则模式(提前编译能提升重复匹配的效率) pattern = re.compile(r"___") # 筛选不含该模式的行 df_clean = df_original[~df_original["PHRASE"].str.match(pattern, na=False)] # 计数逻辑和方法1一致 deleted_count = len(df_original) - len(df_clean) kept_count = len(df_clean)
内容的提问来源于stack exchange,提问作者Navid Aslankhani
相关产品推荐
相关产品推荐

