计算python中只有列和多行的数据帧的编辑距离

2024-06-16 16:59:46 发布

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

我有一个数据帧,它有一列和2000多行。如何计算同一列的每行之间的编辑距离。在

我的数据框如下所示:

  Name
  John
  Mrinmayee
  rituja
  ritz
  divya
  priyanka
  chetna
  chetan
  mansi
  mansvi
  mani
  aliya
  shelia
  Dilip
  Dilipa

我需要计算每行之间的距离?我们怎样才能做到这一点呢。在

我写了一些代码,但这行不通。。给出了一个无价值的距离列表,我猜我在for循环中出错了。有人能帮忙吗

^{pr2}$

Tags: 数据name编辑距离johnmanidivyachetan
1条回答
网友
1楼 · 发布于 2024-06-16 16:59:46

这是一个很好的技巧,我学会了礼貌Adirio。可以使用itertools.product,然后在循环中计算编辑距离。在

from itertools import product

dist = np.empty(df.shape[0]**2, dtype=int) 
for i, x in enumerate(product(df.Name, repeat=2)): 
    dist[i] = editdistance.eval(*x)

dist_df = pd.DataFrame(dist.reshape(-1, df.shape[0]))

dist_df

    0   1   2   3   4   5   6   7   8   9   10  11  12  13  14
0    0   8   6   4   5   7   5   5   5   6   4   5   6   5   6
1    8   0   7   7   7   6   8   8   7   8   7   7   8   8   8
2    6   7   0   3   4   5   5   6   6   6   6   5   5   5   4
3    4   7   3   0   4   6   5   5   5   6   4   4   6   4   5
4    5   7   4   4   0   6   5   5   5   6   5   3   5   4   4
5    7   6   5   6   6   0   6   6   6   7   6   5   7   7   6
6    5   8   5   5   5   6   0   2   6   6   5   5   3   6   5
7    5   8   6   5   5   6   2   0   6   6   5   5   4   6   6
8    5   7   6   5   5   6   6   6   0   1   1   5   5   5   6
9    6   8   6   6   6   7   6   6   1   0   2   5   6   6   6
10   4   7   6   4   5   6   5   5   1   2   0   4   5   4   5
11   5   7   5   4   3   5   5   5   5   5   4   0   4   4   3
12   6   8   5   6   5   7   3   4   5   6   5   4   0   4   4
13   5   8   5   4   4   7   6   6   5   6   4   4   4   0   1
14   6   8   4   5   4   6   5   6   6   6   5   3   4   1   0

np.empty初始化一个空数组,然后在每次调用editdistance.eval时填充该数组。在


借用senderle's ^{},我们可以获得一些速度增益:

^{pr2}$

或者,可以定义一个函数来计算编辑距离并将其矢量化:

def f(x, y):
    return editdistance.eval(x, y)

v = np.vectorize(f)

arr = cartesian_product(df.Name, df.Name).T
arr = v(arr[0, :], arr[1, :])

dist_df = pd.DataFrame(arr.reshape(-1, df.shape[0]))

如果需要带注释的索引和列,可以在构造dist_df时添加:

dist_df = pd.DataFrame(..., index=df.Name, columns=df.Name)

dist_df

Name       John  Mrinmayee  rituja  ritz  divya  priyanka  chetna  chetan  \
Name                                                                        
John          0          8       6     4      5         7       5       5   
Mrinmayee     8          0       7     7      7         6       8       8   
rituja        6          7       0     3      4         5       5       6   
ritz          4          7       3     0      4         6       5       5   
divya         5          7       4     4      0         6       5       5   
priyanka      7          6       5     6      6         0       6       6   
chetna        5          8       5     5      5         6       0       2   
chetan        5          8       6     5      5         6       2       0   
mansi         5          7       6     5      5         6       6       6   
mansvi        6          8       6     6      6         7       6       6   
mani          4          7       6     4      5         6       5       5   
aliya         5          7       5     4      3         5       5       5   
shelia        6          8       5     6      5         7       3       4   
Dilip         5          8       5     4      4         7       6       6   
Dilipa        6          8       4     5      4         6       5       6   

Name       mansi  mansvi  mani  aliya  shelia  Dilip  Dilipa  
Name                                                          
John           5       6     4      5       6      5       6  
Mrinmayee      7       8     7      7       8      8       8  
rituja         6       6     6      5       5      5       4  
ritz           5       6     4      4       6      4       5  
divya          5       6     5      3       5      4       4  
priyanka       6       7     6      5       7      7       6  
chetna         6       6     5      5       3      6       5  
chetan         6       6     5      5       4      6       6  
mansi          0       1     1      5       5      5       6  
mansvi         1       0     2      5       6      6       6  
mani           1       2     0      4       5      4       5  
aliya          5       5     4      0       4      4       3  
shelia         5       6     5      4       0      4       4  
Dilip          5       6     4      4       4      0       1  
Dilipa         6       6     5      3       4      1       0 

相关问题 更多 >