Pandas 如果列表中的子字符串以字符串形式出现,则为新列赋值

Pandas 如果列表中的子字符串以字符串形式出现,则为新列赋值,pandas,list,substring,assign,Pandas,List,Substring,Assign,我有一个数据帧df: tags "a,b,c,d" "c,q,k,t" 以及我需要搜索的字符串列表: searchList = ["a", "b"] 我需要在我的数据框架中添加一个名为“topic”的新列。 如果searchList中的字符串出现在列“tags”中,我需要将该行中的值设置为bool True,否则为bool False 最终结果: tags | topic "a,b,c,d" | True "c,q,k,t" | False 到目前为止,我的代码是: searc

我有一个数据帧df:

tags
"a,b,c,d"
"c,q,k,t"
以及我需要搜索的字符串列表:

searchList =  ["a", "b"]
我需要在我的数据框架中添加一个名为“topic”的新列。 如果searchList中的字符串出现在列“tags”中,我需要将该行中的值设置为bool True,否则为bool False

最终结果:

tags      | topic
"a,b,c,d" | True
"c,q,k,t" | False
到目前为止,我的代码是:

searchList =  ["a", "b"]
pattern = '|'.join(searchfor)
df["topic"] = df.loc[(df["tags"].str.contains('|'.join(pattern), na=False)), True] = True
但我得到了一个错误:

KeyError: 'cannot use a single bool to index into setitem'

您可以将掩码分配给新列,也可以将
模式更改为
搜索列表

searchList =  ["a", "b"]
df["topic"] = df["tags"].str.contains('|'.join(searchList), na=False)
print (df)
      tags  topic
0  a,b,c,d   True
1  c,q,k,t  False
编辑:

详细信息

对于新的
数据帧
,首先与
expand=True一起使用:

print (df["tags"].str.split(',', expand=True))
   0  1  2     3
0  a  b  c     d
1  c  q  k     t
2  a  c  d  None
然后通过以下方式比较会员资格:

print (df["tags"].str.split(',', expand=True).isin(searchList))
       0      1      2      3
0   True   True  False  False
1  False  False  False  False
2   True  False  False  False
并通过
sum
计算
True
s值:

print (df["tags"].str.split(',', expand=True).isin(searchList).sum(axis=1))
0    2
1    0
2    1
dtype: int64

最后一个比较是,
==
的掩码。

谢谢。我可以设置列表变量必须出现的最小值吗?所以“a,b,c”=真(包含列表中的2个值),但“a,c,d”=假(只包含列表中的1个值?
print (df["tags"].str.split(',', expand=True).isin(searchList).sum(axis=1))
0    2
1    0
2    1
dtype: int64