我有一列看起来像这样的数据:
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函数中的列表中搜索多个字符串吗?
感谢您的帮助或建议。
亲切的问候
答案 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)