如何计算两个Pandas DataFrame列之间的Levenshtein距离?

9

我正在尝试计算两个Pandas列之间的Levenshtein距离,但我卡住了。这是我使用的。这是一个最小化、可复制的示例:

import pandas as pd
from textdistance import levenshtein

attempts = [['passw0rd', 'pasw0rd'],
            ['passwrd', 'psword'],
            ['psw0rd', 'passwor']]

df=pd.DataFrame(attempts, columns=['password', 'attempt'])

   password  attempt
0  passw0rd  pasw0rd
1   passwrd   psword
2    psw0rd  passwor

My poor attempt:

df.apply(lambda x: levenshtein.distance(*zip(x['password'] + x['attempt'])), axis=1)

这就是函数的工作方式。它将两个字符串作为参数:

levenshtein.distance('helloworld', 'heloworl')

Out[1]: 2

看看Erfan的这篇帖子,它介绍了如何实现模糊匹配算法fuzzy wuzzy包,该算法使用Levenshtein距离算法来匹配单词。 - Umar.H
听起来这个问题可能会有所帮助?这个问题 - Nightara
1
@Datanovice 我认为这不是关于Levenshtein函数的问题(因为问题已经包含了一个导入来计算它),而是关于如何将其应用到DF上的问题。 - Nightara
当您使用apply时,每一行都作为Series返回给您的lambda函数中的x。为什么要压缩它们?只需将它们作为x['password']等传递即可。 - anishtain4
这个回答解决了你的问题吗?两个Pandas列之间的编辑距离 - Abu Shoeb
1个回答

12

也许我错过了什么,你为什么不喜欢lambda表达式?这个对我来说起作用:

import pandas as pd
from textdistance import levenshtein

attempts = [['passw0rd', 'pasw0rd'],
            ['passwrd', 'psword'],
            ['psw0rd', 'passwor'],
            ['helloworld', 'heloworl']]

df=pd.DataFrame(attempts, columns=['password', 'attempt'])

df.apply(lambda x: levenshtein.distance(x['password'],  x['attempt']), axis=1)

out:

(输出:)
0    1
1    3
2    4
3    2
dtype: int64

2
或者使用 map 函数:df.assign(distance=[*map(levenshtein.distance, df.password, df.attempt)]) - piRSquared

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接