[英]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.