使用Python

问题描述 投票:0回答:1

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

来分类:
python regex pandas dataframe
1个回答
1
投票
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),

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.