Python 使用fuzzyfuzzy在数据框中创建一列匹配结果

Python 使用fuzzyfuzzy在数据框中创建一列匹配结果,python,pandas,fuzzywuzzy,Python,Pandas,Fuzzywuzzy,使用FuzzyFuzzy库将所有结果存储在数据帧列中(我猜这可能需要一个循环?)我遇到了一个挑战。我整天都在为这个问题挠头,现在我想看看你们中是否有人能帮我解决这个问题!会非常有帮助的 作为我要做的一个例子,这里有两个数据帧表 主表 +----+-----------------+ | ID | ITEM | +----+-----------------+ | | | | 1 | Pepperoni Pizza | | |

使用FuzzyFuzzy库将所有结果存储在数据帧列中(我猜这可能需要一个循环?)我遇到了一个挑战。我整天都在为这个问题挠头,现在我想看看你们中是否有人能帮我解决这个问题!会非常有帮助的


作为我要做的一个例子,这里有两个数据帧表

主表

+----+-----------------+
| ID |      ITEM       |
+----+-----------------+
|    |                 |
| 1  | Pepperoni Pizza |
|    |                 |
| 2  | Cheese Pizza    |
|    |                 |
| 3  | Chicken Salad   |
|    |                 |
| 4  | Plain Salad     |
+----+-----------------+
+--------------+---+
| LOOKUP VALUE | - |
+--------------+---+
|              |   |
| Cheese       | - |
|              |   |
| Salad        | - |
+--------------+---+
查找表

+----+-----------------+
| ID |      ITEM       |
+----+-----------------+
|    |                 |
| 1  | Pepperoni Pizza |
|    |                 |
| 2  | Cheese Pizza    |
|    |                 |
| 3  | Chicken Salad   |
|    |                 |
| 4  | Plain Salad     |
+----+-----------------+
+--------------+---+
| LOOKUP VALUE | - |
+--------------+---+
|              |   |
| Cheese       | - |
|              |   |
| Salad        | - |
+--------------+---+
从本质上讲,我试图对主表中的整个值列表使用查找表的值,并将结果存储在第三个表中

以下是我希望最终输出的外观…

+--------------+----------------------------+-------------------+
| LOOKUP VALUE |       MATCHED VALUES       | MATCHED VALUE IDS |
+--------------+----------------------------+-------------------+
|              |                            |                   |
| Cheese       | Cheese Pizza               | 2                 |
|              |                            |                   |
| Salad        | Chicken Salad, Plain Salad | 3,4               |
+--------------+----------------------------+-------------------+
我知道Fuzzy Wuzzy的基本知识,以下是我如何开始的:

from fuzzywuzzy import fuzz
from fuzzywuzzy import process

choices = ["Pepperoni Pizza","Cheese Pizza","Chicken Salad", "Plain Salad"]
process.extract("salad",choices,limit=2)
输出=[(“鸡肉沙拉”,90),(“普通沙拉”,90)]

很好,但是如何以系统的方式实现这一点,对主表中的所有值运行我的所有查找值


非常感谢你把我读出来

在DataFrame中存储列表不是一个好主意,我建议将每个匹配项存储为DataFrame中的一行。代码如下:

from fuzzywuzzy import fuzz
from fuzzywuzzy import process

import pandas as pd
import io

master = pd.read_csv(io.StringIO("""ID,ITEM
1,Pepperoni Pizza
2,Cheese Pizza
3,Chicken Salad
4,Plain Salad"""))

lookups = ["Cheese", "Salad"]

choices = master.set_index("ID").ITEM.to_dict()

res = [(lookup,) + item for lookup in lookups for item in process.extract(lookup, choices,limit=2)]
df = pd.DataFrame(res, columns=["lookup", "matched", "score", "id"])
df
输出:

   lookup        matched  score  id
0  Cheese   Cheese Pizza     90   2
1  Cheese  Chicken Salad     45   3
2   Salad  Chicken Salad     90   3
3   Salad    Plain Salad     90   4

基本上,我从
master
创建一个
choices
dict,用于匹配,然后用于循环
查找
,并将结果存储为列表。最后将列表转换为数据帧。

谢谢,这太完美了!100%同意您的观点,即更具表格结构(正如您给我的那样)比将列表插入数据框(我当时在想什么?)要好得多。再次感谢这对Python初学者非常有帮助!!