现在我想在'评论'中标准化字符串。单词'选举' 。我尝试使用fuzzywuzzy但是无法在pandas数据帧上实现它以部分匹配“选举”这个词。输出数据框应该包含“'选择'在'评论'像这样的列
假设我有大约10万行和可能的组合用于单词'选举'可以很多。 请指导我这一部分。
答案 0 :(得分:2)
根据您给出的答案,您可以使用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)
最后,您使用Comments
和df
函数在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方式来实现这一点。