2017-09-16 66 views
2

我有一列中有一列中的句子的數據框,並且試圖創建一個等於列表顯示字符串的次數的新列。計算數據幀列中出現多個子字符串的次數

例如,有關數據幀貌似

book['sentences'] 
0 The brown dog jumped over the big moon 
1 The brown fox slid under the brown log 

我試圖計算的時代「棕色」的號碼,「過度」和「日誌」中的每個句子出現(即新列將等於2和3)。

我知道我可以str.count做到這一點,但一次只爲一個字符串,然後我會向他們加起來

book['count_brown'] = book['sentences'].str.count('brown') 
book['count_over'] = book['sentences'].str.count('over') 
book['count_log'] = book['sentences'].str.count('log') 
book['count'] = book['count_brown']+book['count_over']+book['count_log'] 

我的琴絃我正在尋找的名單是超過300單詞長,所以即使循環它看起來並不理想。有一個更好的方法嗎?

回答

1

到piRSquared的解決方案類似,但使用的計數get_dummiessum

df 
           sentences 
0 The brown dog jumped over the big moon 
1 The brown fox slid under the brown log 

words = ['brown', 'over', 'log'] 
df = df.sentences.str.extractall('({})'.format('|'.join(words)))\ 
          .iloc[:, 0].str.get_dummies().sum(level=0) 
df 
    brown log over 
0  1 0  1 
1  2 1  0 

如果你想在行的所有字計數一列,沿着第一軸算了筆。

df.sum(1) 
0 2 
1 3 
dtype: int64 
+0

這很好,謝謝! – ctim

2

Ganky!

lst = ['brown', 'over', 'log'] 

book['sentences'].str.extractall(
    '({})'.format('|'.join(lst)) 
).groupby(level=0)[0].value_counts().unstack(fill_value=0) 

0 brown log over 
0  1 0  1 
1  2 1  0 
+0

Ganky是什麼意思? –

+1

@cᴏʟᴅsᴘᴇᴇᴅ討厭的可怕的 – piRSquared

1

隨着nltk頻率分佈的幫助下,你可以做到這一點很容易即

import nltk 
lst = ['brown', 'over', 'log'] 
ndf = df['sentences'].apply(nltk.tokenize.word_tokenize).apply(nltk.FreqDist).apply(pd.Series)[lst].fillna(0) 

輸出:

 
    brown over log 
0 1.0 1.0 0.0 
1 2.0 0.0 1.0 

對於總和

ndf['count'] = ndf.sum(1) 
 
    brown over log count 
0 1.0 1.0 0.0 2.0 
1 2.0 0.0 1.0 3.0 
相關問題