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

Python DataFrame多列正则模式出现次数统计的高效方案咨询

优化DataFrame多列正则匹配计数的效率问题

问题场景

你需要统计DataFrame多列中,前后均为字母的•字符的出现次数,当前逐列调用str.count再求和的方式运行速度较慢,希望找到更高效的实现方法。

示例DataFrame:

column_Acolumn_Bcolumn_C
Test • test abcwinter • sunsnow rain blank
blabla • summer abcbreak • Datatest letter • stop.

原代码问题分析

你当前的代码逐列重复调用str.count和sum,且每次调用都会重新编译正则表达式,数据量较大时会产生额外性能开销:

print(df["column_A"].str.count("(?<=[A-Za-z]) • (?=[A-Za-z])").sum() + df["column_B"].str.count("(?<=[A-Za-z]) • (?=[A-Za-z])").sum() + df["column_C"].str.count("(?<=[A-Za-z]) • (?=[A-Za-z])").sum())

优化方案

方案1:合并多列后统一处理(推荐)

把需要统计的列合并为单个Series,仅执行一次正则匹配与求和,减少重复计算:

# 指定要统计的目标列
target_cols = ["column_A", "column_B", "column_C"]
# 预编译正则表达式,避免重复编译浪费资源
import re
pattern = re.compile(r"(?<=[A-Za-z]) • (?=[A-Za-z])")
# 堆叠多列后统一计数求和
total_count = df[target_cols].stack().str.count(pattern).sum()
print(total_count)

方案2:用apply批量处理行数据

如果不想堆叠列,也可以通过apply对每行的指定列批量计数后再求和:

pattern = re.compile(r"(?<=[A-Za-z]) • (?=[A-Za-z])")
total_count = df[target_cols].apply(lambda row: row.str.count(pattern).sum(), axis=1).sum()
print(total_count)

方案3:矢量化拼接后计数(适合超大数据量)

在确保拼接不会引入误匹配的前提下,将所有列内容拼接成单字符串后一次性计数:

pattern = re.compile(r"(?<=[A-Za-z]) • (?=[A-Za-z])")
# 用空格拼接每行的列内容,避免字符粘连导致误匹配
combined_text = df[target_cols].apply(" ".join, axis=1)
total_count = combined_text.str.count(pattern).sum()
print(total_count)

优化核心逻辑

  1. 预编译正则:提前编译正则表达式,避免每次调用str.count时重复编译,节省CPU资源;
  2. 合并处理流程:减少多次sum和str.count的调用次数,降低方法调用的额外开销;
  3. 利用pandas矢量化特性:stack、apply等方法内部经过底层优化,比逐列循环处理效率更高。

内容的提问来源于stack exchange,提问作者blackmamba

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 15:45:33