在pandas dataframe中计算词频的时间太长

guicsvcw  于 2023-06-28  发布在  其他
关注(0)|答案(1)|浏览(99)

在研究了StackOverflow之后,我想出了下面的代码来计算dataframe的一列中单词的相对频率:

df['objeto'] = df['objeto'].apply(unidecode.unidecode)
df['objeto'] = df['objeto'].str.replace('[^\w\s]','')

stop_words = nltk.corpus.stopwords.words('portuguese')
stop_words.extend(['12', 'termo', 'aquisicao', 'vinte', 'demandas'])

counter = Counter()

for word in " ".join(df['objeto']).lower().split():
    if word not in stop_words:
        counter[word] += 1

print(counter.most_common(10))

for word, count in counter.most_common(100):
    print(word, count)

问题是代码执行大约需要30秒。我做错了什么?有什么方法可以优化和改进我的代码吗?我打算创建一个这样的函数来在其他 Dataframe 上执行此操作。
我是Pandas的初学者,我很少用它。我在stackoverflow上做了些研究。谢谢你。

ttcibm8c

ttcibm8c1#

如果你提供一些可运行的例子,它会有所帮助:

df = pd.DataFrame(dict(
   id = ['a', 'b', 'c', 'd'],
   objeto = ['Foo bar', 'hello Hi FOO', 'Yes hi Hello', 'Pythons PaNdas yeS']
))

stop_words = ['foo', 'bar']

这里的主要问题是不使用Pandas来计数。
pandas有.value_counts()
在本例中,您希望将所有单词放在一个列中,这可以通过.explode()来实现

df['objeto'].str.casefold().str.split().explode()
0        foo
0        bar
1      hello
1         hi
1        foo
2        yes
2         hi
2      hello
3    pythons
3     pandas
3        yes
Name: objeto, dtype: object

您可以.mask()删除的话是.isin(stop_words)然后.value_counts()

df['objeto'].str.casefold().str.split().explode().mask(lambda word: word.isin(stop_words)).value_counts()
objeto
hello      2
hi         2
yes        2
pythons    1
pandas     1
Name: count, dtype: int64

相关问题