[英]Return key on fuzzy match of element in dictionary list
我有一個像這樣的 dataframe:
日期 | 成本類別 | 小販 |
---|---|---|
2021-03-22 | - | 全家便利店 |
2021-03-04 | - | 家庭超市 |
2021-03-14 | - | 地鐵主線 |
2021-03-14 | - | 其他 |
2021-03-14 | - | 交通管理局 |
2021-03-09 | - | 地鐵本地 |
2021-03-24 | - | 7-11 |
2021-03-14 | - | 7-11 |
我想添加這樣的類別標簽:
日期 | 成本類別 | 小販 |
---|---|---|
2021-03-22 | 店鋪 | 全家便利店 |
2021-03-04 | 店鋪 | 家庭超市 |
2021-03-14 | 用餐 | 地鐵主線 |
2021-03-14 | - | 其他 |
2021-03-14 | - | 交通管理局 |
2021-03-09 | 用餐 | 地鐵本地 |
2021-03-24 | 店鋪 | 7-11 |
2021-03-14 | 店鋪 | 7-11 |
我嘗試以下方法,它只會返回列表中匹配元素的值:
from fuzzywuzzy import process
from fuzzywuzzy import fuzz
Store = ['Family Mart', 'Seven Eleven', 'York Mart', 'Tokyu', 'Ministop']
Dining = ['Subway', 'Salad Works']
def fuzz_m(col, cat_list, score_t):
tag, score = process.extractOne(col, cat_list, scorer = score_t)
if score < 51:
return ''
else:
return tag
df['Cost Category'] = df['Vendor'].apply(fuzz_m, cat_list = Store, score_t = fuzz.ratio)
日期 | 成本類別 | 小販 |
---|---|---|
2021-03-22 | 全家超市 | 全家便利店 |
2021-03-04 | 全家超市 | 家庭超市 |
2021-03-14 | - | 地鐵主線 |
2021-03-14 | - | 其他 |
2021-03-14 | - | 交通管理局 |
2021-03-09 | - | 地鐵本地 |
2021-03-24 | 7-11 | 7-11 |
2021-03-14 | 7-11 | 7-11 |
我想要做的是使用字典代替 cat_list 並返回成本類別中的鍵。
dictionary = {'Store':['Family Mart', 'Seven Eleven', 'York Mart', 'Tokyu', 'Ministop'],
'Dining':['Subway', 'Salad Works']
}
如果列中的任何值與列表中的元素匹配 51+,那么我想在成本類別下添加鍵。 如果是低匹配(低於 51),我什么也不想做。
是否有可行的方法來實現這一目標?
使用Series.apply()
, fuzz_m()
一次接收一個Vendor
值,因此您可以將該dictionary
直接用作extractOne(value, dictionary)
:
def fuzz_m(value):
_, score, tag = process.extractOne(value, dictionary)
return tag if score > 50 else '-'
df['Cost Category'] = df['Vendor'].apply(fuzz_m)
# Date Cost Category Vendor
# 0 2021-03-22 Store FamilyMart
# 1 2021-03-04 Store FAMILY MART
# 2 2021-03-14 Dining Subway MAIN
# 3 2021-03-14 - OTHER
# 4 2021-03-14 - Transit Authority
# 5 2021-03-09 Dining Subway local
# 6 2021-03-24 Store Seven Eleven
# 7 2021-03-14 Store Seven-Eleven
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.