问题描述
List_FullCompanyName = ['Google','Microsoft','Accenture']
输入数据在 Dataframe 中,如下所述
公司名称代码 | 借方金额 | 公司全名 | 信用额度 |
---|---|---|---|
xyzGoog | 100 | zm | |
abcMicrosof | 200 | zx | |
xcdAccentu | 300 | qt | |
working123 | 谷歌 | 52 | |
next45 | 微软 | 500 | |
parlell54 | 埃森哲 | 95 |
根据 'FullCompanyName' 的字符串值,在 'CompanyNamecode' 列中找到匹配的部分字符串,并应用对应的部分字符串匹配记录的公式,amount = CreditAmount - DebitAmount。
如果 FullCompanyName 名称少于 3 个字符,则忽略字符串匹配(例如 zm,zx,qt),并且如果 CompanyNamecode 不包含部分字符串(例如 next45,parlell54),则忽略该记录。 例子: 'FullCompanyName' = 'Google' 在 'CompanyNamecode' = 'Goog' 中查找部分字符串匹配。要与 CompanyNamecode 列值匹配,请使用 rstrip() 并应用公式 Amount = 52-100
使用字典的预期输出,
Amount_Dict = { FullCompanyName:Amount},
Amount_Dict = {'谷歌':-48,'微软':300,'埃森哲':-205}
解决方法
import numpy as np
import pandas as pd
from difflib import SequenceMatcher
df = pd.DataFrame(columns=['CompanyNamecode','DebitAmount','FullCompanyName','CreditAmount'],data=[['xyzGoog',100,pd.NA,pd.NA],['abcMicrosof',200,['xcdAccentu',300,[pd.NA,'Google',52],'Microsoft',500],'Accenture',95]
]
)
code = df['CompanyNamecode'].dropna()
fullname = df['FullCompanyName'].dropna()
d = {}
for ix,fn in fullname.iteritems():
matches = [SequenceMatcher(a=fn,b=cd).find_longest_match(0,len(fn),len(cd)).size for cd in code]
best_match = np.argmax(matches)
d[fn] = df['CreditAmount'][ix] - df['DebitAmount'][best_match]
code.drop(best_match)
print(d) # --> {'Google': -48,'Microsoft': 300,'Accenture': -205}