Pandas中如何逐行计算同列其他行的Levenshtein距离平均值并新增列
实现方法
你可以直接通过 pandas 的apply方法实现需求,适合小数据量场景的代码如下:
import pandas as pd # 你已实现的距离计算函数 def lev_dist(string_1,string_2): ''' 该函数已完成实现,可返回两个输入字符串的距离值 ''' pass # 你已有的DataFrame df = pd.DataFrame({'words': ['cat','bat','mat','dog']}) # 逐行计算平均距离 df['avg_distance'] = df['words'].apply( lambda current_word: df['words'][df['words'] != current_word].apply( lambda compare_word: lev_dist(current_word, compare_word) ).mean() )
逻辑说明
- 外层
apply遍历words列的每一个字符串作为当前计算的基准词 - 首先筛选出同列所有不等于基准词的字符串,逐个计算和基准词的Levenshtein距离
- 对所有距离取平均值,赋值给当前行的
avg_distance列
如果你的数据量较大,双重apply的执行效率较低,可以用纯Python循环提前计算所有平均值再赋值,优化性能:
word_list = df['words'].tolist() avg_res = [] for cur in word_list: dist_sum = 0 cnt = 0 for w in word_list: if w != cur: dist_sum += lev_dist(cur, w) cnt += 1 avg_res.append(dist_sum / cnt) df['avg_distance'] = avg_res
结果验证
以你给出的示例数据为例,最终输出结果如下:
| words | avg_distance |
|---|---|
| cat | 1.666667 |
| bat | 1.666667 |
| mat | 1.666667 |
| dog | 3.000000 |
内容的提问来源于stack exchange,提问作者Fardin Ahsan
相关产品推荐
相关产品推荐

