我有一个熊猫DataFrame,其中包含一列字符串值。我需要根据部分字符串匹配来选择行。

类似于这个成语:

re.search(pattern, cell_in_question) 

返回布尔值。我熟悉df[df['A']==“helloworld”]的语法,但似乎找不到一种方法来处理部分字符串匹配,比如“hello”。


当前回答

快速提示:如果要基于索引中包含的部分字符串进行选择,请尝试以下操作:

df['stridx']=df.index
df[df['stridx'].str.contains("Hello|Britain")]

其他回答

在此之前,有一些答案可以实现所要求的功能,无论如何,我想展示最普遍的方式:

df.filter(regex=".*STRING_YOU_LOOK_FOR.*")

这样,你就可以得到你所寻找的专栏,无论它是怎么写的。

(显然,您必须为每种情况编写正确的正则表达式)

假设您有以下DataFrame:

>>> df = pd.DataFrame([['hello', 'hello world'], ['abcd', 'defg']], columns=['a','b'])
>>> df
       a            b
0  hello  hello world
1   abcd         defg

您始终可以在lambda表达式中使用in运算符来创建筛选器。

>>> df.apply(lambda x: x['a'] in x['b'], axis=1)
0     True
1    False
dtype: bool

这里的技巧是在apply中使用axis=1选项,将元素逐行传递给lambda函数,而不是逐列传递。

如果需要对panda数据帧列中的字符串进行不区分大小写的搜索:

df[df['A'].str.contains("hello", case=False)]

矢量化字符串方法(即Series.str)允许您执行以下操作:

df[df['A'].str.contains("hello")]

这在熊猫0.8.1及以上版本中可用。

对于包含特殊字符的字符串,使用contains效果不佳。尽管找到了工作。

df[df['A'].str.find("hello") != -1]