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

Pandas中基于多列正则表达式高效筛选行并构建新DataFrame的优化方法咨询

Pandas中基于多列正则表达式高效筛选行并构建新DataFrame的优化方法咨询

你的问题在处理大规模数据集时非常典型——分步创建中间DataFrame再复制列的方式,会带来大量冗余的数据遍历和拷贝开销,尤其是当原DataFrame有数十万行时,性能问题会被放大。我们可以用布尔索引+向量化操作的思路来大幅优化效率,下面是具体的解决方案:

问题根源分析

你当前的做法绕了弯路:str.extract会为整个原DataFrame生成包含匹配结果或NaN的新列,这本身就需要遍历所有行;后续复制列到新DataFrame的过程,又会额外产生数据拷贝。而你的核心需求其实是筛选出满足任一正则条件的行(从示例结果看,是F_NAME以"Sar"开头,或者L_NAME以"Mari"开头的行),完全可以一步到位完成。

优化后的实现代码

我们直接生成布尔掩码,用掩码筛选原DataFrame——这是Pandas底层优化的向量化操作,效率会高很多:

# 为每列生成匹配正则的布尔掩码(na=False避免NaN导致的筛选异常)
mask_fname = base_dataframe["F_NAME"].str.contains(r'^Sar', na=False)
mask_lname = base_dataframe["L_NAME"].str.contains(r'^Mari', na=False)

# 组合掩码:筛选满足任一条件的行,直接生成新DataFrame
new_dataframe = base_dataframe[mask_fname | mask_lname].copy()

如果之后还需要提取匹配的内容到新列,也只需要对筛选后的小数据集操作,而不是整个原DataFrame:

# 仅对已筛选的行提取匹配内容,进一步提升性能
new_dataframe["selected_F_NAME"] = new_dataframe["F_NAME"].str.extract(r'(?P<sar_content>^Sar.*)')
new_dataframe["selected_L_NAME"] = new_dataframe["L_NAME"].str.extract(r'(?P<mar_content>^Mari.*)')

扩展到多列多条件场景

如果你的实际需求涉及更多列、更多正则条件,只需要继续添加掩码,然后用逻辑运算符组合即可:

  • 若需要同时满足多个条件,用&(与)
  • 若需要满足任一条件,用|(或)

示例:

# 筛选F_NAME含"Sar"且L_NAME含"ink",或者EMAIL以"mail.com"结尾的行
mask1 = base_dataframe["F_NAME"].str.contains(r'^Sar', na=False)
mask2 = base_dataframe["L_NAME"].str.contains(r'ink$', na=False)
mask3 = base_dataframe["EMAIL"].str.contains(r'mail\.com$', na=False)

new_dataframe = base_dataframe[(mask1 & mask2) | mask3].copy()

为什么这个方法更快?

  1. 向量化操作:str.contains是Pandas的向量化字符串方法,底层用C实现,遍历效率远高于分步处理
  2. 减少中间数据:直接通过掩码筛选,避免了创建多个中间DataFrame,减少了内存占用和数据拷贝的开销
  3. 按需处理:如果需要提取匹配内容,仅对筛选后的行操作,处理量大幅减少

备注:内容来源于stack exchange,提问作者Saly07

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 09:49:37