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

如何基于子字符串筛选DataFrame行并创建子DataFrame?

解决方法:筛选DataFrame中包含指定子串的行

嘿,你的问题出在对loc索引和字符串判断的理解上,我来给你一步步讲清楚怎么搞定!

首先,你原来的代码rslt_df = all_responses.loc['*VP01*' in all_responses['soundIn']]有两个核心问题:

  • '*VP01*' in all_responses['soundIn']并不是逐行检查每个soundIn元素是否包含VP01,而是在判断整个Series里有没有完全等于*VP01*的元素,这显然不是你想要的效果。
  • 这里的*也不是通配符,Python原生的in操作符不支持用*来匹配任意字符。

下面是几种可行的正确方法,按推荐程度排序:

方法1:使用str.contains()(最推荐)

Pandas的Series有专门的字符串处理方法str.contains(),它会矢量化地检查每个字符串元素是否包含指定子串,返回一个布尔值Series,刚好可以用来给loc做索引:

# 直接筛选包含'VP01'的行
rslt_df = all_responses.loc[all_responses['soundIn'].str.contains('VP01')]

如果你的子串里有正则特殊字符(比如.、*这些),可以加上regex=False参数,让它按普通字符串匹配:

rslt_df = all_responses.loc[all_responses['soundIn'].str.contains('VP01', regex=False)]

方法2:使用列表推导式生成布尔掩码

如果你习惯Python原生的字符串判断,可以手动生成一个布尔列表作为筛选条件:

# 逐行检查每个soundIn字符串是否包含VP01
mask = ['VP01' in s for s in all_responses['soundIn']]
rslt_df = all_responses.loc[mask]

方法3:使用apply()配合lambda函数

这种方法也能实现,但效率比str.contains()低(尤其是大数据集),适合用来理解逻辑:

rslt_df = all_responses.loc[all_responses['soundIn'].apply(lambda x: 'VP01' in x)]

这几种方法都能帮你得到只包含soundIn列有VP01子串的新DataFrame,优先选方法1哦,它是Pandas官方推荐的矢量化操作,速度最快!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:12:38