我想提高回圈性能,它計算文本中出現的單詞,但它現在運行5 分鐘左右 5 條記錄
資料框
No Text
1 I love you forever...*500 other words
2 No , i know that you know xxx *100 words
我的單詞表
wordlist =['i','love','David','Mary',......]
我計算字數的代碼
for i in wordlist :
df[i] = df['Text].str.count(i)
結果 :
No Text I love other_words
1 I love you ... 1 1 4
2 No, i know ... 1 0 5
uj5u.com熱心網友回復:
您可以通過Counter從每個Text值中的單詞生成 a ,然后將其轉換為列(使用pd.Series),將不存在的列求和然后洗掉這些列來做到這wordlist一點other_words:
import re
import pandas as pd
from collections import Counter
wordlist = list(map(str.lower, wordlist))
counters = df['Text'].apply(lambda t:Counter(re.findall(r'\b[a-z] \b', t.lower())))
df = pd.concat([df, counters.apply(pd.Series).fillna(0).astype(int)], axis=1)
other_words = list(set(df.columns) - set(wordlist) - { 'No', 'Text' })
df['other_words'] = df[other_words].sum(axis=1)
df = df.drop(other_words, axis=1)
輸出(對于您問題中的示例資料):
No Text i love other_words
0 1 I love you forever... other words 1 1 4
1 2 No , i know that you know xxx words 1 0 7
筆記:
I我已將所有單詞轉換為小寫,因此您無需i單獨計算。- 我使用
re.findall了而不是更明顯的split(),因此forever...被視為單詞forever而不是forever...
如果您只想計算其中的單詞wordlist(并且不想other_words計算),您可以將其簡化為:
wordlist = list(map(str.lower, wordlist))
counters = df['Text'].apply(lambda t:Counter(w for w in re.findall(r'\b[a-z] \b', t.lower()) if w in wordlist))
df = pd.concat([df, counters.apply(pd.Series).fillna(0).astype(int)], axis=1)
輸出:
No Text i love
0 1 I love you forever... other words 1 1
1 2 No , i know that you know xxx words 1 0
另一種生成other_words值的方法是生成 2 組計數器,一個是所有單詞,一個是 中的單詞wordlist。然后可以將它們彼此相減,以找到文本中不在單詞串列中的單詞數:
wordlist = list(map(str.lower, wordlist))
counters = df['Text'].apply(lambda t:Counter(w for w in re.findall(r'\b[a-z] \b', t.lower()) if w in wordlist))
df = pd.concat([df, counters.apply(pd.Series).fillna(0).astype(int)], axis=1)
c2 = df['Text'].apply(lambda t:Counter(re.findall(r'\b[a-z] \b', t.lower())))
df['other_words'] = (c2 - counters).apply(lambda d:sum(d.values()))
其輸出與第一個代碼示例相同。請注意,在 Python 3.10 及更高版本中,您應該能夠使用新total功能:
(c2 - counters).apply(Counter.total)
uj5u.com熱心網友回復:
作為替代方案,你可以試試這個:
counts = (df['Text'].str.lower().str.findall(r'\b[a-z] \b')
.apply(lambda x: pd.Series(x).value_counts())
.filter(map(str.lower, wordlist)).fillna(0))
df[counts.columns] = counts
print(df)
'''
№ Text i love
0 1 I love you forever... other words 1.0 1.0
1 2 No , i know that you know xxx words 1.0 0.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/519857.html
