def labelling(text):
cleanser = re.findall(re.compile(r'^(?=.*cleanser)+', flags=re.I | re.X), text)
face_wash = re.findall(re.compile(r'^(?=.*face)(?=.*wash).+', flags=re.I | re.X), text)
mask = re.findall(re.compile(r'^(?=.*mask)+', flags=re.I | re.X), text)
moisturizer = re.findall(re.compile(r'^(?=.*moisturizer)+', flags=re.I | re.X), text)
if cleanser:
return "Face Wash"
elif face_wash:
return "Face Wash"
elif mask:
return "Mask"
elif moisturizer:
return "Moisturizer"
else:
return " "
df['category']=df['product_name'].apply(lambda x : labelling(x))
有人可以使用循环和字典来解释一个更简单的函数,因此我们仅输入字典中的单词和标签,然后在循环中称其为“?”。
您可以根据多种条件使用
np.select
来分类:import numpy as np
import pandas as pd
df = pd.DataFrame({'product_name':['this is a cleanser here', 'Another phrase is face wash', 'You know, a mask.','We need a moisturizer', 'No cateogry']})
c_list = [
df['product_name'].str.contains(r'cleanser', case=False, regex=False),
df['product_name'].str.contains(r'^(?=.*face)(?=.*wash)', case=False, regex=True),
df['product_name'].str.contains(r'mask', case=False, regex=False),
df['product_name'].str.contains(r'moisturizer', case=False, regex=False)
]
categories = ['Face Wash', 'Face Wash', 'Mask', 'Moisturizer']
df['category'] = np.select(c_list, categories, default=' ')
>>> df
product_name category
0 this is a cleanser here Face Wash
1 Another phrase is face wash Face Wash
2 You know, a mask. Mask
3 We need a moisturizer Moisturizer
4 No cateogry
I将四个右翼分子转换为四分之一,并用regex=False
转换为固定的字符串检查。如果您计划仅匹配整个单词,请恢复为regex=True
\b
,例如r'\bcleanser\b'
.。
注意
default=' '
插入空间以防万一不匹配任何条件。 您可以将前两个条件加入一个:
np.select
您可以尝试一下,
df['product_name'].str.contains(r'^(?=.*face)(?=.*wash)|cleanser', case=False, regex=True),