如何使用Pandas查找包含指定子字符串的单元格位置
用Pandas查找包含指定子字符串的单元格位置
嘿,我来帮你搞定这个需求!首先得先把你给的示例数据整理成正确的Pandas DataFrame,然后一步步实现查找逻辑。
第一步:构造示例DataFrame
你提供的示例数据可以整理成下面这个结构(三列,三行数据):
import pandas as pd data = [ [947.2, 1.25, "BAM"], [1.25, 129.3, "2.1 $"], [1.25, "161.69 $", "0.8 CAD"] ] df = pd.DataFrame(data, columns=["Price", "Rate p/lot", "Total Comm"])
生成的DataFrame长这样:
Price Rate p/lot Total Comm 0 947.2 1.25 BAM 1 1.25 129.3 2.1 $ 2 1.25 161.69 $ 0.8 CAD
第二步:实现查找逻辑
这里给你两种实用的方法,分别适合不同场景:
方法一:简洁直观的列表推导式+applymap
如果你的数据集不大,这种方法简单易懂:
target_substrings = ['$', 'CAD'] # 先创建一个布尔矩阵,标记每个单元格是否包含目标子串 match_mask = df.applymap(lambda cell: any(sub in str(cell) for sub in target_substrings)) # 从布尔矩阵中提取所有匹配的位置 result = [(row_idx, col_idx) for row_idx, col_idx in zip(*match_mask.nonzero())]
方法二:高效向量化的stack+str.contains
如果数据集比较大,用Pandas的向量化操作会更快:
target_substrings = ['$', 'CAD'] # 把目标子串拼成正则表达式的匹配模式 match_pattern = '|'.join(target_substrings) # 把DataFrame堆叠成带多级索引的Series,然后筛选匹配项 stacked_data = df.stack().str.contains(match_pattern, na=False) result = [tuple(index) for index in stacked_data[stacked_data].index]
第三步:验证结果
不管用哪种方法,运行后result的输出都是:
[(1, 2), (2, 1), (2, 2)]
完全符合你的预期!
一些关键细节说明
- 用
str(cell)把所有单元格转成字符串,这样不管是数值还是文本类型,都能检查子串是否存在 any(sub in str(cell) ...)确保只要单元格包含目标列表中的任意一个子串就算匹配- 第一种方法里的
nonzero()会返回布尔矩阵中所有True值的行和列索引,用zip配对就得到了位置元组 - 第二种方法的
stack()会把二维表格转成一维Series,它的多级索引正好对应原DataFrame的行和列,筛选后直接提取索引就行
内容的提问来源于stack exchange,提问作者Piyush S. Wanare
相关产品推荐
相关产品推荐

