Если необходимо подсчитать количество kewords из столбца не для каждой строки, как для другого anser, но общее:
Одним из возможных решений является join
значения столбца с пробелом и split
, для подсчета используйте Counter
и последний фильтр в понимании слова:
from collections import Counter
L = ['aaa','bbb','ccc']
c = Counter((' '.join(df['words'])).split())
out = {k: v for k, v in c.items() if k in L}
Модификация - сначала разделить, затем отфильтровать и последний счет - лучше, если в реальных данных много уникальных слов:
out = Counter(x for x in (' '.join(df['words'])).split() if x in set(L))
Другое решение панд этопервое изменение формы, затем фильтр и последнее число:
s = df['words'].str.split(expand=True).stack()
out = s[s.isin(L)].value_counts()
Время :
Зависит от количества слов в списке L
, длины DataFrame и количества уникальныхслова, поэтому в реальных данных должно быть иначе:
df = pd.DataFrame({'words':['aaa vv bbb bbb ddd','bbb aaa','ccc ccc','bbb ccc']})
df = pd.concat([df] * 10000, ignore_index=True)
from collections import Counter
L = ['aaa','bbb','ccc']
c = Counter((' '.join(df['words'])).split())
out = {k: v for k, v in c.items() if k in L}
print (out)
s = df['words'].str.split(expand=True).stack()
out = s[s.isin(L)].value_counts()
print (out)
In [6]: %%timeit
...: c = Counter((' '.join(df['words'])).split())
...: out = {k: v for k, v in c.items() if k in L}
...:
24.8 ms ± 276 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [7]: %%timeit
...: s = df['words'].str.split(expand=True).stack()
...: out = s[s.isin(L)].value_counts()
...:
145 ms ± 865 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)