在数据列中搜索字符串列表

时间:2020-04-24 10:15:11

标签: python string pandas lambda

我有一列看起来像这样的数据:

import pandas as pd
import numpy as np

   Items
0  Product A + Product B + Product C   
1  Product A + Product B + Product B1 + Product C1 
2  

我想浏览一下这些物品,并找出该列中是否包含一些特定的物品,这些物品与我感兴趣地标记为包含在物品栏中的产品有关:

My_Items = ['Product B', 'Product C', 'Product C1']

我尝试了以下lambda函数,但如果该列中有不止一种产品,则它没有提取我正在搜索的字符串:

df['My Items'] = df['Items'].apply(lambda x: 'Contains my items' if x in My_Items else '')

有人知道如何在lambda函数中的列表中搜索多个字符串吗?

感谢您的帮助或建议。

亲切的问候

3 个答案:

答案 0 :(得分:3)

Series.str.count用于计数匹配值,然后使用Series.gt进行更大的测试,例如1

mask = df.Items.str.count('|'.join(My_Items)).gt(1)

df['My Items'] = np.where(mask,'Contains 2 or more items', '')
print (df)
                                             Items                  My Items
0                Product A + Product B + Product C  Contains 2 or more items
1  Product A + Product B + Product B1 + Product C1  Contains 2 or more items

详细信息

print (df.Items.str.count('|'.join(My_Items)))
0    2
1    3
Name: Items, dtype: int64

答案 1 :(得分:2)

IIUC,您可以使用str.findall并检查我们是否至少有2个匹配项:

import numpy as np

m = df.Items.str.findall('|'.join(My_Items)).str.len().ge(2)
df['My items'] = np.where(m, 'Contains at least 2 items', '')

如果我们检查仅包含1个产品的其他行:

print(df)

                        Items  \
0                Product A + Product B + Product C      
1  Product A + Product B + Product B1 + Product C1     
2                            Product A + Product D    

                    My items  
0  Contains at least 2 items  
1  Contains at least 2 items  
2                             

df.Items.str.findall('|'.join(My_Items))在列出所有找到的匹配项的地方:

df.Items.str.findall('|'.join(My_Items))

 [Product B, Product C]
1    [Product B, Product B, Product C]
2                                   []
Name: Items, dtype: object

答案 2 :(得分:-1)

谢谢你们!我一直在寻找的解决方案最终是您的两​​个答案的结合!

我最终要做的是用这个面具,所以我可以过滤:

DF['My_Items'] = DF.Items.str.findall('|'.join(My_list)).str.len().gt(1)

然后使用它作为项目列表,因此我现在可以分析组合:

DF['My_Items'] = DF.Items.str.findall('|'.join(My_list)).astype(str)