Python 计算多个子字符串在dataframe列中出现的次数
我有一个dataframe,其中一列中有一个句子列表,我正在尝试创建一个新列,该列的数量等于字符串列表出现的次数 例如,相关的数据帧如下所示Python 计算多个子字符串在dataframe列中出现的次数,python,string,pandas,dataframe,Python,String,Pandas,Dataframe,我有一个dataframe,其中一列中有一个句子列表,我正在尝试创建一个新列,该列的数量等于字符串列表出现的次数 例如,相关的数据帧如下所示 book['sentences'] 0 The brown dog jumped over the big moon 1 The brown fox slid under the brown log 我试图计算“brown”、“over”和“log”在每个句子中出现的次数(即新列将等于2和3) 我知道我可以用str.count来做这件事,但一次只能做一个
book['sentences']
0 The brown dog jumped over the big moon
1 The brown fox slid under the brown log
我试图计算“brown”、“over”和“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个单词,因此即使有一个循环,它似乎也不是最优的。有更好的方法吗?甘基
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
与piRSquared的解决方案类似,但使用
get_dummies
和sum
进行计数
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
借助
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
棕色超过原木计数
0 1.0 1.0 0.0 2.0
1 2.0 0.0 1.0 3.0
甘基是什么意思?@cᴏʟᴅsᴘᴇᴇᴅ 讨厌的恶心的可怕的
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