如何基于子字符串筛选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
相关产品推荐
相关产品推荐

