Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python fuzzyfuzzy规范化列中的字符串_Python_Pandas_Dataframe_Levenshtein Distance_Fuzzywuzzy - Fatal编程技术网

Python fuzzyfuzzy规范化列中的字符串

Python fuzzyfuzzy规范化列中的字符串,python,pandas,dataframe,levenshtein-distance,fuzzywuzzy,Python,Pandas,Dataframe,Levenshtein Distance,Fuzzywuzzy,我有一个这样的数据帧 现在我想规范化单词“election”的“comments”列中的字符串。我尝试使用fuzzyfuzzy,但无法在pandas数据框架上实现它,以部分匹配单词“election”。输出数据框的“评论”列中应该有“选举”一词,如下所示 假设我有大约10万行,单词“election”的可能组合可能很多。 请在这一部分指导我。好的,我自己尝试过,并想出了以下代码- for i in range(len(df)): a = [] a = df.comments[i].split()

我有一个这样的数据帧

现在我想规范化单词“election”的“comments”列中的字符串。我尝试使用fuzzyfuzzy,但无法在pandas数据框架上实现它,以部分匹配单词“election”。输出数据框的“评论”列中应该有“选举”一词,如下所示

假设我有大约10万行,单词“election”的可能组合可能很多。
请在这一部分指导我。

好的,我自己尝试过,并想出了以下代码-

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方法来实现这一点吗。

好的,我自己也试过了,并想出了以下代码-

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方法来实现这一点吗。

不要在数据帧上操作。头顶上的东西会要了你的命。将列转换为
列表
,然后迭代覆盖该列。最后将该列表分配回列。

不要对数据帧进行操作。头顶上的东西会要了你的命。将列转换为
列表
,然后迭代覆盖该列。最后将该列表分配回该列。

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

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()})
然后使用
apply
fuzz.ratio
的比较,使用更正的单词(根据您的想法)创建列:

df_temp['corrected_comments'] = df_temp['split_comments'].apply(
    lambda wd: 'election' if fuzz.ratio(wd, 'election') > 75 else wd)
最后,您可以使用
groupby
join
函数在
df
评论栏中回写更正后的数据:

df['Comments'] = df_temp.reset_index().groupby('level_0').apply(
    lambda wd: ' '.join(wd['corrected_comments']))

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

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()})
然后使用
apply
fuzz.ratio
的比较,使用更正的单词(根据您的想法)创建列:

df_temp['corrected_comments'] = df_temp['split_comments'].apply(
    lambda wd: 'election' if fuzz.ratio(wd, 'election') > 75 else wd)
最后,您可以使用
groupby
join
函数在
df
评论栏中回写更正后的数据:

df['Comments'] = df_temp.reset_index().groupby('level_0').apply(
    lambda wd: ' '.join(wd['corrected_comments']))

如果你能安装它,请在检查拼写检查(这里似乎更像你的问题)@Ben.T你能检查我发布的答案并给出任何减少运行时间的建议吗?如果你能安装它,请在检查拼写检查(这里似乎更像你的问题)@Ben.T你能检查我发布的答案并给出任何减少运行时间的建议吗,我正在研究一个类似的问题。由于我有一个庞大的数据集要处理,您是否能够找到更好的优化技术来完成此任务。嗨,Akhilesh,利用第一个答案中提到的方法,这应该会有所帮助。嗨,我正在处理一个类似的问题。我有一个庞大的数据集要处理,你能找到更好的优化方法吗?嗨,Akhilesh,利用第一个答案中提到的方法,这应该会有所帮助。