Hyp*_*nja 2 python function dataframe levenshtein-distance pandas
假设我有一个数据帧df1:
Sr A B C
1 rains It rain there. It rains there
2 plane This is a vertical planes This is a vertical plane
3 tree Plant a trees Plant a tree
Run Code Online (Sandbox Code Playgroud)
列C是我的预期输出.我需要比较B列的字符串中的每个单词和A中的单词,如果Levenshtein距离为1,则将其替换.
我的方法:
import jellyfish as jf
def word_replace(str1):
comp = #don't know how to store value of column A in this variable.
for word in str1.split():
if jf.levenshtein_distance(word,comp) == 1:
word = comp
else:
pass
return str1
df1['C'] = df1['B'].apply(word_replace)
Run Code Online (Sandbox Code Playgroud)
第二件事,如果列A有双字"near miss"怎么样?我如何修改上述代码?例如:
Sr A B C
1 near miss that was a ner mis that was a near miss
Run Code Online (Sandbox Code Playgroud)
您已经在一个问题中提出了两个问题,这对Stack Overflow来说绝不是一个好主意.我只想回答你的第一个问题,如果你想让别人看看你的第二个问题,那么我建议你专门为它写一个新问题.
pd.DataFrame.apply可以跨行或跨列工作,您希望单独处理每一行,因此您必须传递axis=1关键字参数.
下面是一些解决您问题的代码,它使用列表理解,利用三元运算符来选择需要替换的单词.然后使用这个列表连接在一起str.join().
最初你的代码在迭代字符串上进行迭代,但是这不起作用,因为你在迭代列表时无法修改它们.它还假设函数的输入是一个字符串,这是不正确的,因为它将是一个pandas.Series对象.
这是一段简化的代码,并没有考虑标点符号之类的内容,我将其作为练习留给读者.
import pandas as pd
import jellyfish as jf
data1 = {'A':['rains','plane','tree'],'B':['It rain there','This is a vertical planes','Plant a trees']}
df1 = pd.DataFrame(data1)
def word_replace(row):
comp = row['A']
str1 = row['B']
out = ' '.join([comp if jf.levenshtein_distance(word, comp) == 1
else word for word in str1.split()])
return out
df1['C'] = df1.apply(word_replace, axis=1)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
376 次 |
| 最近记录: |