如何在Pandas DataFrame整行中检测指定子字符串并获取对应ID?
高效筛选Pandas DataFrame中任意列包含指定子串的行ID
嘿,我懂你这种被低效方法卡得头疼的感觉——循环、拼接列、转字典这些操作,数据量一大就慢得离谱。下面给你分享几个基于Pandas矢量化特性的高效解法,完全避开Python层面的循环,速度提升可不是一星半点!
核心思路
利用Pandas的矢量化字符串操作结合行维度的任意匹配,直接在底层C语言层面完成批量计算,这才是Pandas处理这类问题的正确打开方式。
方法一:灵活匹配所有name开头的列(推荐)
如果你的目标列都是name开头(比如name1到name10),用filter可以快速选中这些列,不用手动列全所有列名:
# 1. 自动选中所有列名含"name"的列 name_columns = df.filter(like='name') # 2. 检测每个单元格是否包含"ball",再判断每行是否至少有一个匹配 match_mask = name_columns.str.contains('ball', na=False).any(axis=1) # 3. 提取符合条件的ID matched_ids = df.loc[match_mask, 'ID'].tolist()
代码细节说明:
df.filter(like='name'):自动匹配所有列名包含name的列,不管你是name1到name10还是更多,都能一键选中;str.contains('ball', na=False):矢量化检测每个单元格的子串,na=False确保空值被判定为不匹配,避免干扰结果;.any(axis=1):检查每一行是否至少有一列匹配成功,返回一个布尔掩码;- 最后用掩码过滤DataFrame,直接提取对应的ID即可。
方法二:指定明确列范围
如果你的列是严格的name1到name10,也可以直接用列切片选中目标列:
# 1. 选中name1到name10的列范围 name_columns = df.loc[:, 'name1':'name10'] # 2. 生成匹配掩码 match_mask = name_columns.str.contains('ball', na=False).any(axis=1) # 3. 获取去重后的结果ID(防止ID重复的情况) matched_ids = df.loc[match_mask, 'ID'].unique().tolist()
为什么这个方法比你的旧方法高效?
你之前尝试的循环遍历、拼接列、转字典遍历,都是在Python层面逐元素处理,而Pandas的矢量化操作是在底层C语言批量计算,完全避开了Python循环的巨大开销。数据量越大,这种效率差距越明显——比如10万行数据,循环可能要几十秒,矢量化方法几百毫秒就能搞定!
内容的提问来源于stack exchange,提问作者Winds
相关产品推荐
相关产品推荐

