如何优化数据帧中单个列的所有行的Levenshtein距离计算?

2024-05-13 13:35:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我想计算一个数据帧中单个列的所有行的Levenshtein距离。当我交叉连接包含约115000行的数据帧时,我得到了MemoryError。最后,我只想保留Levenshtein距离为1或2的行。有没有一种优化的方法可以做到这一点

以下是我的暴力方法:

import pandas as pd
from textdistance import levenshtein
# from itertools import product

# original df
df = pd.DataFrame({'Name':['John', 'Jon', 'Ron'], 'Phone':[123, 456, 789], 'State':['CA', 'GA', 'MA']})
# create another df containing all rows and a few columns needed for further checks
name = df['Name']
phone = df['Phone']
dic_ = {'Name_Match':name,'Phone_Match':phone}
df_match = pd.DataFrame(dic_, index=range(len(name)))

df['key'] = 1
df_match['key'] = 1

# cross join df containing all columns with another df containing some of its columns
df_merged = pd.merge(df, df_match, on='key').drop("key",1)

# keep only rows where distance = 1 or distance = 2
df_merged['distance'] = df_merged.apply(lambda x: levenshtein.distance(x['Name'], x['Name_Match']), axis=1)

原始数据帧:

Out[1]:   
   Name  Phone State  
0  John    123    CA  
1   Jon    456    GA  
2   Ron    789    MA  

原始数据帧的新数据帧:

df_match
Out[2]: 
  Name_Match  Phone_Match
0       John          123
1        Jon          456
2        Ron          789

交叉连接:

df_merged
Out[3]: 
   Name  Phone State Name_Match  Phone_Match  distance
0  John    123    CA       John          123         0
1  John    123    CA        Jon          456         1
2  John    123    CA        Ron          789         2
3   Jon    456    GA       John          123         1
4   Jon    456    GA        Jon          456         0
5   Jon    456    GA        Ron          789         1
6   Ron    789    MA       John          123         2
7   Ron    789    MA        Jon          456         1
8   Ron    789    MA        Ron          789         0

最终输出:

df_merged[((df_merged.distance==1)==True) | ((df_merged.distance==2)==True)]
Out[4]: 
   Name  Phone State Name_Match  Phone_Match  distance
1  John    123    CA        Jon          456         1
2  John    123    CA        Ron          789         2
3   Jon    456    GA       John          123         1
5   Jon    456    GA        Ron          789         1
6   Ron    789    MA       John          123         2
7   Ron    789    MA        Jon          456         1

Tags: namedfmatchphonemergedjohncadistance
1条回答
网友
1楼 · 发布于 2024-05-13 13:35:00

您的问题与levenshtein距离无关,您的主要问题是在执行操作时设备内存(RAM)不足(您可以使用windows中的任务管理器或linux/mac上的tophtop命令进行检查)

一种解决方案是在启动apply操作之前将数据帧划分为更小的分区,并在每个分区上运行它,然后在处理下一个分区之前删除不需要的分区

如果你在云上运行它,你可以得到一台内存更多的机器

好处:我建议您使用类似Pandarallel的东西来并行化apply操作,以加快速度

相关问题 更多 >