Python fuzzyfuzzy规范化列中的字符串
我有一个这样的数据帧 现在我想规范化单词“election”的“comments”列中的字符串。我尝试使用fuzzyfuzzy,但无法在pandas数据框架上实现它,以部分匹配单词“election”。输出数据框的“评论”列中应该有“选举”一词,如下所示 假设我有大约10万行,单词“election”的可能组合可能很多。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()
请在这一部分指导我。好的,我自己尝试过,并想出了以下代码-
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方法来实现这一点吗。不要在数据帧上操作。头顶上的东西会要了你的命。将列转换为
列表
,然后迭代覆盖该列。最后将该列表分配回列。不要对数据帧进行操作。头顶上的东西会要了你的命。将列转换为列表
,然后迭代覆盖该列。最后将该列表分配回该列。根据您给出的答案,您可以使用pandasapply
、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']))
根据您给出的答案,您可以使用pandasapply
、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,利用第一个答案中提到的方法,这应该会有所帮助。