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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:05:51