fuzzywuzzy在pandas列中规范化字符串

时间:2018-04-26 13:12:03

标签: python pandas dataframe levenshtein-distance fuzzywuzzy

我有一个像input dataframe

这样的数据框

现在我想在'评论'中标准化字符串。单词'选举' 。我尝试使用fuzzywuzzy但是无法在pandas数据帧上实现它以部分匹配“选举”这个词。输出数据框应该包含“'选择'在'评论'像这样的列output dataframe

假设我有大约10万行和可能的组合用于单词'选举'可以很多。 请指导我这一部分。

3 个答案:

答案 0 :(得分:2)

根据您给出的答案,您可以使用pandas applystackgroupby函数来加速您的代码。你有如下输入:

import pandas as pd
from fuzzywuzzy import fuzz
df = pd.DataFrame({'Merchant details': ['Alpha co','Bravo co'],
                   'Comments':['electionsss are around',
                               'vote in eelecttions']}) 

对于列'注释',您可以通过拆分并使用stack函数创建一个包含每行一个字的临时多指数DF:

df_temp = pd.DataFrame(
    {'split_comments':df['Comments'].str.split(' ',expand=True).stack()})

然后使用applyfuzz.ratio的比较创建带有更正字词的列(根据您的想法):

df_temp['corrected_comments'] = df_temp['split_comments'].apply(
    lambda wd: 'election' if fuzz.ratio(wd, 'election') > 75 else wd)

最后,您使用Commentsdf函数在groupby的{​​{1}}专栏中回复了更正后的数据:

join

答案 1 :(得分:1)

不要对数据框进行操作。开销会杀了你。将列转换为list,然后迭代即可。最后将该列表分配回列。

答案 2 :(得分:0)

好的,我自己尝试了这个代码 -

for i in range(len(df)):
a = []
a = df.comments[i].split()
for j in word:
    for k in range(len(a)):
        if fuzz.ratio(j,a[k]) > 75:
            a[k] = j
df.comments[i] = a
df.comments[i] = ' '.join(df.comments[i])

但是这种方法对于大型数据帧来说似乎很慢。 有人可以提供更好的pythonic方式来实现这一点。