我看过很多关于这个主题的问题,但大多数与我的相反。我有一个字符串列表(数据框的列)和一个子字符串列表。我想将每个字符串与子字符串列表进行比较,如果它包含一个子字符串,则返回该子字符串,否则打印“不匹配”。
subs = [cat, dog, mouse]
df
Name Number SubMatch
dogfood 1 dog
catfood 3 cat
dogfood 2 dog
mousehouse 1 mouse
birdseed 1 no match
虽然我当前的输出看起来像这样:
Name Number SubMatch
dogfood 1 dog
catfood 3 dog
dogfood 2 dog
mousehouse 1 dog
birdseed 1 dog
我怀疑我的代码只是返回系列中的第一件事,如何将其更改为系列中的正确内容?这是函数:
def matchy(col, subs):
for name in col:
for s in subs:
if any(s in name for s in subs):
return s
else:
return 'No Match'
请您参考如下方法:
解决这个问题的 pandaic 方法是根本不使用循环。您可以使用 str.extract 非常简单地完成此操作:
p = '({})'.format('|'.join(subs))
df['SubMatch'] = df.Name.str.extract(p, expand=False).fillna('no match')
df
Name Number SubMatch
0 dogfood 1 dog
1 catfood 3 cat
2 dogfood 2 dog
3 mousehouse 1 mouse
4 birdseed 1 no match
