Pandas 如果列表中的子字符串以字符串形式出现,则为新列赋值
我有一个数据帧df: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
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