Python DataFrame多列正则模式出现次数统计的高效方案咨询
优化DataFrame多列正则匹配计数的效率问题
问题场景
你需要统计DataFrame多列中,前后均为字母的•字符的出现次数,当前逐列调用str.count再求和的方式运行速度较慢,希望找到更高效的实现方法。
示例DataFrame:
| column_A | column_B | column_C |
|---|---|---|
| Test • test abc | winter • sun | snow rain blank |
| blabla • summer abc | break • Data | test 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)
优化核心逻辑
- 预编译正则:提前编译正则表达式,避免每次调用
str.count时重复编译,节省CPU资源; - 合并处理流程:减少多次
sum和str.count的调用次数,降低方法调用的额外开销; - 利用pandas矢量化特性:
stack、apply等方法内部经过底层优化,比逐列循环处理效率更高。
内容的提问来源于stack exchange,提问作者blackmamba
相关产品推荐
相关产品推荐

