微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用列表值和熊猫数据框创建字典

如何解决使用列表值和熊猫数据框创建字典

我有以下完整公司名称列表,

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}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。