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

在Pandas DataFrame中通过正则匹配获取匹配单元格的行列索引

最优方法:用Pandas矢量化操作替代双重循环

好问题!双重循环遍历DataFrame确实是效率最低的做法,尤其是当数据量较大时,Python层面的循环会拖慢整个处理流程。Pandas本身提供了矢量化的字符串匹配方法,能让你高效找到符合正则的单元格索引,下面就给你两种最优实现方案:

核心思路

先通过str.contains()生成布尔掩码(标记每个单元格是否匹配正则),再从掩码中提取符合条件的行列索引,全程避免Python循环,利用Pandas/NumPy的底层优化提升性能。

示例准备

先创建一个测试用的DataFrame:

import pandas as pd
import numpy as np

# 构造包含字符串的DataFrame,部分带数字、部分不带
df = pd.DataFrame({
    'col1': ['abc123', 'def456', 'ghi'],
    'col2': ['jkl789', 'mno', 'pqr012'],
    'col3': ['stu', 'vwx345', 'yz']
})
# 目标正则:匹配包含数字的字符串
pattern = r'\d'

方案一:用stack()快速提取索引

这种方法代码简洁,可读性强,适合大多数场景:

# 生成布尔掩码:每个单元格是否匹配正则(na=False处理NaN值)
mask = df.apply(lambda col: col.str.contains(pattern, na=False))

# 堆叠掩码并筛选出匹配的项,最后转成索引元组列表
matched_indices = mask.stack()[mask.stack()].index.tolist()

print(matched_indices)
# 输出结果:[(0, 'col1'), (0, 'col2'), (1, 'col1'), (1, 'col3'), (2, 'col2')]

解释:

  • apply(lambda col: col.str.contains(...))对每一列应用字符串匹配,生成和原DataFrame形状一致的布尔矩阵;
  • stack()会把列索引转换成多级索引的第二部分,把二维结构变成一维的Series;
  • 最后筛选出值为True的项,其索引就是(行索引, 列名)的元组。

方案二:用np.where()获取坐标(性能更优)

如果你的DataFrame数据量极大,推荐用这种基于NumPy的方法,性能会比stack()略高:

# 同样先生成布尔掩码
mask = df.apply(lambda col: col.str.contains(pattern, na=False))

# 获取匹配单元格的行、列位置数组
row_positions, col_positions = np.where(mask)

# 把位置转换成对应的索引元组(行位置转成DataFrame的行索引,列位置转成列名)
matched_indices = list(zip(df.index[row_positions], df.columns[col_positions]))

print(matched_indices)
# 输出和方案一完全一致的结果

解释:

  • np.where()直接返回布尔矩阵中True值的行、列坐标(是整数位置,不是索引标签);
  • 再通过df.index和df.columns把整数位置映射成实际的索引标签和列名,最后打包成元组列表。

注意事项

  1. 处理非字符串列:如果DataFrame里有非字符串类型的列(比如数值型),str.contains()会报错,建议先筛选出字符串列再处理:
    str_columns = df.select_dtypes(include=['object']).columns
    mask = df[str_columns].apply(lambda col: col.str.contains(pattern, na=False))
    
  2. NaN值处理:str.contains()中的na=False参数很关键,它会把NaN值标记为不匹配,避免出现NaN导致的掩码混乱。

为什么比双重循环好?

双重循环是在Python层面逐单元格遍历,而这两种方法都是利用Pandas/NumPy的矢量化操作,底层用C语言实现循环,性能差距会随着数据量增大而急剧拉开——比如处理10万行的DataFrame,矢量化方法的速度可能是双重循环的100倍以上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:01:46