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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:11:53