Каков наиболее эффективный способ подсчета вхождений группы определенных ключевых слов в пандах? - PullRequest
0 голосов
/ 21 сентября 2019

Я знаю способ подсчета определенного ключевого слова в pandas dataframe, но мне интересно, есть ли какой-нибудь эффективный способ получения подсчетов для каждого из набора определенных ключевых слов все вместе вместо того, чтобы делать одно за другим?

Ответы [ 2 ]

3 голосов
/ 21 сентября 2019

Это не очень хороший вопрос, потому что там так мало деталей, но я предполагаю, что у вас есть ряд строк, каждая из которых содержит несколько «слов», разделенных «разделителями», и у вас есть основной список ключевых слов, которыеВы хотите количество в каждом ряду?В этом случае

>>> import pandas as pd, re
>>> s = pd.Series(['a,b', 'b,c', 'c'])   
>>> s
0    a,b
1    b,c
2      c
dtype: object
>>> keywords = ['a', 'b'] 
>>> pattern = re.compile('|'.join(map(re.escape, keywords)))  # Form regex matching any keyword
>>> s.str.count(pattern)
0    2
1    1
2    0
dtype: int64
0 голосов
/ 21 сентября 2019

Если необходимо подсчитать количество 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...