【问题标题】:How do I optimize Levenshtein distance calculation for all rows of a single column of a Pandas DataFrame?如何优化 Pandas DataFrame 单列的所有行的 Levenshtein 距离计算?
【发布时间】:2021-03-16 16:32:03
【问题描述】:

我想计算 Pandas DataFrame 单列的所有行的 Levenshtein 距离。当我交叉加入包含约 115,000 行的 DataFrame 时,我收到了 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

【问题讨论】:

标签: python pandas dataframe out-of-memory levenshtein-distance


【解决方案1】:

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

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

如果你在云上运行它,你可以换一台内存更大的机器。

奖励:我建议您使用 Pandarallel 之类的东西并行化 apply 操作以使其更快。

【讨论】:

    猜你喜欢
    • 2020-05-17
    • 2013-01-15
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多