如何在大型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
相关产品推荐
相关产品推荐

