Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算多个子字符串在dataframe列中出现的次数_Python_String_Pandas_Dataframe - Fatal编程技术网

Python 计算多个子字符串在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来做这件事,但一次只能做一个

我有一个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['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