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

如何在大型DataFrame中查找并定位子串所在的行和列?

解决大型DataFrame子串定位问题

针对你的百万行、70多列的DataFrame,要同时找到包含目标子串的行和对应列,可以用以下高效方法:

方法一:快速收集所有匹配位置(推荐用于大数据量)

先生成布尔矩阵标记每个元素是否包含子串,再通过stack()提取匹配的行索引和列名:

# 生成布尔掩码:每个元素为True表示包含子串
mask = df.astype(str).str.contains('substring')

# 筛选出所有为True的位置,重置索引整理结果
matches = mask.stack()[mask.stack()].reset_index()
matches.columns = ['行索引', '列名', '匹配状态']

# 去掉冗余的匹配状态列,只保留位置信息
matches = matches[['行索引', '列名']]

这个方法用向量化操作替代逐行apply,处理百万级数据的效率远高于循环或行级lambda,结果会直接给出所有匹配的行和列的对应关系。

方法二:在原DataFrame中添加匹配列列表

如果需要保留原数据的同时,给每行标注包含子串的列名,可以用apply(大数据量下速度略慢于方法一):

mask = df.astype(str).str.contains('substring')
# 给原DF新增一列,存储该行匹配的列名列表
df['匹配列'] = mask.apply(lambda row: row[row].index.tolist(), axis=1)

# 筛选出存在匹配的行
matching_rows = df[df['匹配列'].str.len() > 0]

性能优化技巧

由于你的DataFrame列数较多,可针对性减少处理范围:

  • 只处理object类型的列:数值列通常不需要转字符串检查子串,先筛选出文本列再处理:
# 筛选出所有文本类型的列
text_cols = df.select_dtypes(include=['object']).columns
mask = df[text_cols].astype(str).str.contains('substring')

这样能大幅减少需要转换和检查的数据量,提升整体速度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 18:42:37