如果列表中的子字符串出现在字符串中,则将值分配给新列

问题描述 投票:1回答:1

我有一个数据框df:

tags
"a,b,c,d"
"c,q,k,t"

和我需要搜索的字符串列表:

searchList =  ["a", "b"]

我需要在我的数据框中添加一个名为“主题”的新列。如果来自searchList的字符串出现在“标签”列中,则需要将该行的值设置为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'

pandas list substring assign
1个回答
1
投票

您可以将掩码分配给新列,也可以将pattern更改为searchList

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

编辑:

searchList =  ["a", "b"]
df["topic"] = df["tags"].str.split(',', expand=True).isin(searchList).sum(axis=1).eq(2)
print (df)
      tags  topic
0  a,b,c,d   True
1  c,q,k,t  False
2    a,c,d  False

详细信息

首先将Series.str.splitSeries.str.split一起用于新的expand=True

DataFrame

然后按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 比较成员身份:

DataFrame.isin

并用DataFrame.isin计算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 的值:

True

最后一次按sum进行比较,print (df["tags"].str.split(',', expand=True).isin(searchList).sum(axis=1)) 0 2 1 0 2 1 dtype: int64 作为掩码。

© www.soinside.com 2019 - 2024. All rights reserved.