将列文本模式与定义的列表进行比较,并将定义列表中的第一个匹配字符串返回到dataframe中的新列

2024-05-16 17:51:11 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有咖啡店的菜单单。我想获取文本并返回数量和项目名称

menu = ['Cappuccino','Café Latte','Expresso','Macchiato ','Irish coffee ']

现在,我想从我的菜单中提取匹配的编号和订购项目名称(菜单中的任何第一个匹配项)

示例文本:带1个Capputino

输出数据帧:

      text                          Quantity                   match

     Bring 1 Capputino                 1                     Cappuccino  

不需要输入的文本拼写将与菜单完全相同,所以它只会从“匹配”列中的菜单列表返回匹配模式

我写了下面的代码,但在匹配栏中返回Nan。感谢您的指导

代码:

    import pandas as pd
    import numpy as np
    import re

    def ccd():
    global df

menu = ['Cappuccino','Café Latte','Expresso','Macchiato ','Irish coffee ']

for i in range(len(menu)):
    menu[i] = menu[i].upper()


order = input('Enter a substring: ').upper()



args_dict = {'CAPUCINO':'CAPPUCCINO',
             "COFFI":"COFFEE",
             "COOKI":"COOKIE" } 
#order=order.split()

for i,j in enumerate(order):
    if j in args_dict:
        order[i]=args_dict[j]
df = pd.DataFrame({'text':[order]})
df["Quantity"] = df.text.str.extract('(\d+)')
df['match'] = df.text.str.extract('(' + '|'.join(menu) + ')')

Tags: textin文本importdf菜单argsorder
1条回答
网友
1楼 · 发布于 2024-05-16 17:51:11

请看以下内容:

import re

menu_map = {'cap': 'Cappucino',
            'caf': 'Café Latte',
            "cof": "Irish coffee",
            "cok": "Cookie",
            "cook": "Cookie"} 

order = input('Enter a substring: ')

df = pd.DataFrame({'Text': [order]})
df["Quantity"] = df.Text.str.extract('(\d+)')
df['Match'] = df.Text.str.extract('(' + '|'.join(menu_map) + ')', flags=re.IGNORECASE)
df['Replacement'] = df.Match.str.casefold().map(menu_map)

order == 'Bring 1 Caputino'的结果

               Text Quantity Match Replacement
0  Bring 1 Caputino        1   Cap   Cappucino

order == 'Bring 1 Caxutino'

               Text Quantity Match Replacement
0  Bring 1 Caxutino        1   NaN         NaN

因为在menu_map中没有捕捉'Caxutino'的模式

在我看来这就是你想要的?由于您不希望使用Replacement列(我只是为了透明而使用它),因此您可以执行以下操作:

df['Match'] = df.Text.str.extract('(' + '|'.join(menu_map) + ')', flags=re.IGNORECASE)
df.Match = df.Match.str.casefold().map(menu_map)

(我不明白你想用for ... if ...部分实现什么。)

编辑:现在我理解了for ... if ...部分,我建议以下方法:

args_dict = {'capu': 'Cappuccino', 'chap': 'Cappuccino', 
             'cof': 'Coffee', 'coof': 'Coffee', 'chof': 'Coffee',
             'cok': 'Cookie', 'chok': 'Cookie', 'choo': 'Cookie'}

order = order.split()
for i, word in enumerate(order):
    word = word.casefold()
    for key in args_dict:
        if word.startswith(key):
            order[i] = args_dict[key]
            break
order = ' '.join(order)

或:

args_dict = {('capu', 'chap'): 'Cappuccino', 
             ('cof', 'coof', 'chof'): 'Coffee',
             ('cok', 'chok', 'choo'): 'Cookie'}

order = order.split()
for i, word in enumerate(order):
    word = word.casefold()
    for keys, replacement in args_dict.items():
        for key in keys:
            if word.startswith(key):
                order[i] = replacement
                break
order = ' '.join(order)

相关问题 更多 >