【问题标题】:Logic used for this string pattern matching script for use with in a df column用于此字符串模式匹配脚本的逻辑,用于 df 列
【发布时间】:2019-12-04 16:08:54
【问题描述】:

我的 df 包含以下列:

['Date', 'Company Name', Amount]

但是,在Company Name 下,有时一家公司的名称与另一家公司的名称相似;例如。 'Acme Corporation' vs 'Acme Corpor' 是同一家公司。

为了更具体地了解 df,下面是一个示例:

['Date', 'Company Name',  'Amount']
['01/01',    'ACME',         100  ]
['01/01', 'ACME Corpor',     150  ]
['01/01', 'ACME Corpor',     150  ]
['01/02', 'ACME Corporation', 50  ]

这当然跨越其他日期,共有 2500 多家独特公司

我需要的是(例如)在不影响 ACME 的情况下将 ACME Corpor 转变为 ACME Corporation(基于上面的示例 df)

我已经建立了某种逻辑来执行此操作,但我认为我的整个脚本效率低下或只是有问题。

我的逻辑基于以下代码块:

from difflib import SequenceMatcher

def similar(a, b):
    return SequenceMatcher(None, a, b).ratio()

我从中得到的:How to find similar rows in columns with difflib?

所以基本上我在Company Name 列中将两个项目(ab)匹配在一起,如果匹配结果高于 0.7,则确定一个任意阈值(在本例中我设置为 0.7),然后我将a 附加到一个新列(比如new_names),如果没有,我附加b

from difflib import SequenceMatcher

def similar(a, b):
    return SequenceMatcher(None, a, b).ratio()

new_name = []

for i in range(0,len(df.company)-1):
    if (similar(df.company[i],df.company[i+1]) > 0.7) & (i != 0):
        new_name.append(df.customer[i])
    else:
        new_name.append(df.customer[i+1])

这并没有真正发生,我认为这是由于“公司名称”列中发生的重复。我已经尝试将上面的代码块用于分组数据帧,我相信它可以正常工作,但我想尽可能地使用"raw"df 上的脚本

【问题讨论】:

    标签: python string-matching


    【解决方案1】:

    您是否有任何类型的列表,其中包含所有您想要的公司名称?就像在您的示例中一样:

    desire_names = ['ACME', 'ACME_Corporation']

    如果是,那么您可以通过例如 Levenshtein 距离来测量从“公司名称”到desired_names 的所有字符串的距离。这可能会有所帮助row to row distance measure in pandas。如果您的desired_names 列表很长,那么计算成本会很高,因为您必须测量所有“公司名称”字符串和desire_names 字符串之间的距离。

    如果你有类似的字典

    desire_names = {'ACME': 'ACME', 'ACME_CORP': 'ACME_CORPORATION', 'ACME_CORPORATION': 'ACME_CORPORATION'}

    那么你就可以使用 df.replace 函数了。

    【讨论】:

    • 遗憾的是,我认为我们手头没有这些公司的名单,但我可以确认并记下您附加的链接。我想这样我就可以在“公司名称”列中获得独特的项目,然后自己制作一个……我可以将其保存为备用计划,因为我们真的时间紧迫。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 2015-06-06
    • 2012-11-28
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    相关资源
    最近更新 更多