微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决将列文本模式与定义的列表进行比较,并将定义列表中的第一个匹配字符串返回到数据框中的新列

假设我有咖啡店菜单列表。我想取文本并返回数量和商品名称

this.name = response.data.data.name

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

示例文本:带上 1 个 Capputino

输出数据帧:

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

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

我写了下面的代码,但它在匹配列中返回了 Nan。感谢任何指导。

代码

      text                          Quantity                   match

     Bring 1 Capputino                 1                     Cappuccino  

解决方法

请看以下内容:

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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?