如何使用levenshtein函数在熊猫中删除相似的值 - python

我有一个看起来像的数据框-

   ML_ENTITY_NAME        EDT_ENTITY_NAME
1  ABC BANK              HABIB METROPOLITAN BANK
2  ABC BANK              HABIB METROPOLITIAN BANK
3  BANK OF AMERICA       HSBC BANK MALAYSIA BHD
4  BANK OF AMERICA       HSBC BANK MALAYSIA SDN BHD
5  BANK OF NEW ZEALAND   HUA NAN COMMERCIAL BANK
6  BANK OF NEW ZEALAND   HUA NAN COMMERCIAL BANK LTD
7  CITIBANK N.A.         CHINA GUANGFA BANK CO LTD
8  CITIBANK N.A.         CHINA GUANGFA BANK CO.,LTD
9  SECURITY BANK CORP.   SECURITY BANK CORP
10 SIAM COMMERCIAL BANK  THE SIAM COMMERCIAL BANK PCL
11 TEMU                  ANZ BANK SAMOA LTD

我写了一个levenshtein函数,看起来像-

def fm(s1, s2):
    score = Levenshtein.distance(s1,s2)
    if score == 0.0:
        score = 1.0
    else:
        score = 1 - (score / len(s1))
    return score

我想编写一个代码,如果两个EDT_ENTITY_NAME值的levenstein得分为greater than .75,那么我们将删除长度较小的一个值,并保留长度较大的一个值。用于比较的ML_ENTITY_NAME也应相同。

我的最终输出应如下所示:

   ML_ENTITY_NAME        EDT_ENTITY_NAME
1  ABC BANK              HABIB METROPOLITIAN BANK
2  BANK OF AMERICA       HSBC BANK MALAYSIA SDN BHD
3  BANK OF NEW ZEALAND   HUA NAN COMMERCIAL BANK LTD
4  CITIBANK N.A.         CHINA GUANGFA BANK CO.,LTD
5  SECURITY BANK CORP.   SECURITY BANK CORP
6  SIAM COMMERCIAL BANK  THE SIAM COMMERCIAL BANK PCL
7  TEMU                  ANZ BANK SAMOA LTD

目前,我的方法是对df进行排序并在循环中进行迭代,并检查ML_ENTITY_NAME的值是否相同,然后为EDT_ENTITY_NAME计算levenshtein。我已经添加了一个新的列删除,如果满足上述条件并且一个ML_ENTITY_NAME的长度小于其他ML_ENTITY_NAME的长度,我会将Delete列更新为1。

我的代码看起来像-

df.sort_values(by=['ML_ENTITY_NAME','EDT_ENTITY_NAME'],inplace=True)
df['delete']=0
for row1 in df.itertuples():
    for row2 in df.itertuples():
        if (str(row1.ML_ENTITY_NAME) == str(row2.ML_ENTITY_NAME)) and (1>fm(str(row1.EDT_ENTITY_NAME),str(row2.EDT_ENTITY_NAME))>.74):

            if(len(row1.EDT_ENTITY_NAME)>len(row2.EDT_ENTITY_NAME)):
                df.loc[row2.Index,row2[2]]=1
print(df)

目前它给出了错误的输出。

有人可以帮我一些答案/提示/建议吗?

参考方案

您能指定所得到的输出到底有什么问题吗?我在代码中看到的唯一偏离目标的地方是,对于具有0.74 <fm(...)<1的行对,仅将delete标志设置为1,而应该将其设置为0.75 <fm(...) 。

顺便说一句,排序在代码中是多余的,因为最终还是要比较每对可能的行。实现排序时,您可能要记住的是遍历每对连续的行,这将使您的代码从O(n2)到O(n)的复杂性提高。

另一个注意事项是,您在if函数中不需要fm语句:语句score = 1 - score / len(s1)将涵盖两种情况。

重命名默认ID python - python

我想连接两个dataFrames,但是两个数据具有不同的ID,所以结果是错误的这是我的代码data=pd.DataFrame(df.columns) data1=data.drop(axis=1,index=[0,1,2,3]).transpose() data1 这是dataframe1另一个数据框:y=sma_algo(df.loc['H+L&…

pandas DataFrame:根据另一列中的布尔值计算总和 - python

我对Python相当陌生,我尝试在pandas中模拟以下逻辑我目前正在循环抛出行,并希望对前几行的AMOUNT列中的值求和,但只求和最后一次看到的“ TRUE”值。实际数据似乎效率低下(我的数据框大约有500万行)?想知道用Python处理这种逻辑的有效方法是什么?逻辑:逻辑是,如果FLAG为TRUE,我想对前几行的AMOUNT列中的值求和,但只求和最后一次…

Python GPU资源利用 - python

我有一个Python脚本在某些深度学习模型上运行推理。有什么办法可以找出GPU资源的利用率水平?例如,使用着色器,float16乘法器等。我似乎在网上找不到太多有关这些GPU资源的文档。谢谢! 参考方案 您可以尝试在像Renderdoc这样的GPU分析器中运行pyxthon应用程序。它将分析您的跑步情况。您将能够获得有关已使用资源,已用缓冲区,不同渲染状态上…

Python:图像处理可产生皱纹纸效果 - python

也许很难描述我的问题。我正在寻找Python中的算法,以在带有某些文本的白色图像上创建皱纹纸效果。我的第一个尝试是在带有文字的图像上添加一些真实的皱纹纸图像(具有透明度)。看起来不错,但副作用是文本没有真正起皱。所以我正在寻找更好的解决方案,有什么想法吗?谢谢 参考方案 除了使用透明性之外,假设您有两张相同尺寸的图像,一张在皱纹纸上明亮,一张在白色背景上有深…

Python-Excel导出 - python

我有以下代码:import pandas as pd import requests from bs4 import BeautifulSoup res = requests.get("https://www.bankier.pl/gielda/notowania/akcje") soup = BeautifulSoup(res.cont…