使用 fuzzywuzzy 在数据框中创建一列匹配结果
Using fuzzywuzzy to create a column of matched results in the data frame
我 运行 面临使用 FuzzyWuzzy 库将所有结果存储在数据框列中的挑战(我猜它可能需要一个循环?)我一直在挠头一整天,现在我想看看你们中是否有人可以帮助我解决问题!会非常有帮助!
作为我正在尝试做的一个例子,这里有 2 个数据框 tables…
硕士Table
+----+-----------------+
| ID | ITEM |
+----+-----------------+
| | |
| 1 | Pepperoni Pizza |
| | |
| 2 | Cheese Pizza |
| | |
| 3 | Chicken Salad |
| | |
| 4 | Plain Salad |
+----+-----------------+
查找Table
+--------------+---+
| LOOKUP VALUE | - |
+--------------+---+
| | |
| Cheese | - |
| | |
| Salad | - |
+--------------+---+
本质上,我正在尝试使用查找 table 的值来对照主 table 中的整个值列表,并将结果存储在第三个 table 中。
这是我希望最终输出的样子...
+--------------+----------------------------+-------------------+
| 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)
输出 = [('Chicken Salad', 90), ('Plain Salad', 90)]
很好,但是你如何以系统的方式做到这一点,运行 我所有的查找值与主 table 中的所有值相比?
非常感谢您阅读我的文章!
将列表存储在 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
字典进行匹配,然后循环 lookups
并将结果存储为列表。最后将列表转换为 DataFrame。
我 运行 面临使用 FuzzyWuzzy 库将所有结果存储在数据框列中的挑战(我猜它可能需要一个循环?)我一直在挠头一整天,现在我想看看你们中是否有人可以帮助我解决问题!会非常有帮助!
作为我正在尝试做的一个例子,这里有 2 个数据框 tables…
硕士Table
+----+-----------------+
| ID | ITEM |
+----+-----------------+
| | |
| 1 | Pepperoni Pizza |
| | |
| 2 | Cheese Pizza |
| | |
| 3 | Chicken Salad |
| | |
| 4 | Plain Salad |
+----+-----------------+
查找Table
+--------------+---+
| LOOKUP VALUE | - |
+--------------+---+
| | |
| Cheese | - |
| | |
| Salad | - |
+--------------+---+
本质上,我正在尝试使用查找 table 的值来对照主 table 中的整个值列表,并将结果存储在第三个 table 中。
这是我希望最终输出的样子...
+--------------+----------------------------+-------------------+
| 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)
输出 = [('Chicken Salad', 90), ('Plain Salad', 90)]
很好,但是你如何以系统的方式做到这一点,运行 我所有的查找值与主 table 中的所有值相比?
非常感谢您阅读我的文章!
将列表存储在 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
字典进行匹配,然后循环 lookups
并将结果存储为列表。最后将列表转换为 DataFrame。