string.contains中的“and”运算符

jogvjijk  于 2022-10-23  发布在  其他
关注(0)|答案(5)|浏览(200)

我有一个Pandas系列,我用这种方式应用字符串搜索

df['column_name'].str.contains('test1')

这将根据字符串“test1”是否包含在列“column_name”中给出true/false列表。
然而,我无法测试两个字符串,我需要检查两个字符串是否都存在。类似于

df['column_name'].str.contains('test1' and 'test2')

这似乎不起作用。任何建议都很好。

smdnsysy

smdnsysy1#

不,您必须创建2个条件,并使用&,并根据运算符优先级将条件括起来:

(df['column_name'].str.contains('test1')) & (df['column_name'].str.contains('test2))

如果你想测试任何一个单词,那么以下方法都可以:

df['column_name'].str.contains('test1|test2')
wnavrhmk

wnavrhmk2#

all( word in df['column_name'] for word in ['test1', 'test2'] )

这将测试字符串中的任意数字或单词

fdx2calv

fdx2calv3#

忽略'test2中缺少的引号,“and”运算符是布尔逻辑运算符。它不会连接字符串,也不会执行您认为它执行的操作。

>>> 'test1' and 'test2'
'test2'
>>> 'test1' or 'test2'
'test1'
>>> 10 and 20
20
>>> 10 and 0
10
>>> 0 or 20
20
>>> # => and so on...

发生这种情况是因为andor运算符用作“真值判定器”,并且对字符串有稍微奇怪的行为。本质上,返回值是最后一个要计算的值,无论它是字符串还是其他值。看看这个行为:

>>> a = 'test1'
>>> b = 'test2'
>>> c = a and b
>>> c is a
False
>>> c is b
True

后一个值被分配给我们赋予它的变量。您正在寻找的是一种迭代一个或一组字符串的方法,并确保所有字符串都为true。为此,我们使用all(iterable)函数。

if all([df['column_name'].contains(_) for _ in ['test1', 'test2']]):
    print("All strings are contained in it.")
else:
    print("Not all strings are contained in it.")

假设情况属实,下面是您将收到的示例:

>>> x = [_ in df['column_name'] for _ in ['test1', 'test2']
>>> print(x)
[True, True] # => returns True for all()
>>> all(x)
True
>>> x[0] = 'ThisIsNotIntTheColumn' in df['column_name']
>>> print(x)
[False, True]
>>> all(x)
False
atmip9wb

atmip9wb4#

您想知道test1test2是否在列中的某个位置。
所以df['col_name'].str.contains('test1').any() & df['col_name'].str.contains('test2').any()

ffscu2ro

ffscu2ro5#

这是我的第一个答复)
试试我的功能。它搜索一个被空格分隔的字符串中的所有字母。它非常适合我。

from functools import reduce

def filter_by_tag(df, filter_string, search_col='TAG'):  # searches in 'TAG' column by default
    letters = filter_string.strip().upper().split(' ')
    filtered_df = df[reduce(lambda a, b: a & b, (df[search_col].str.contains(s, na=False) for s in letters))]
    return filtered_df

相关问题