我想计算一个数据帧中单个列的所有行的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
您的问题与levenshtein距离无关,您的主要问题是在执行操作时设备内存(RAM)不足(您可以使用windows中的任务管理器或linux/mac上的
top
或htop
命令进行检查)一种解决方案是在启动
apply
操作之前将数据帧划分为更小的分区,并在每个分区上运行它,然后在处理下一个分区之前删除不需要的分区如果你在云上运行它,你可以得到一台内存更多的机器
好处:我建议您使用类似Pandarallel的东西来并行化
apply
操作,以加快速度相关问题 更多 >
编程相关推荐