2013-07-10 5 views
8

Я хочу подсчитать количество вхождений определенных слов в фрейме данных. Я знаю, используя «str.contains»Количество вхождений определенных слов в pandas dataframe

a = df2[df2['col1'].str.contains("sample")].groupby('col2').size() 
n = a.apply(lambda x: 1).sum() 

В настоящее время я использую вышеуказанный код. Есть ли способ сопоставления регулярного выражения и получения количества вхождений? В моем случае у меня большой кадр данных, и я хочу совместить около 100 строк.

ответ

9

str.contains метод принимает регулярное выражение:

Definition: df.words.str.contains(self, pat, case=True, flags=0, na=nan) 
Docstring: 
Check whether given pattern is contained in each string in the array 

Parameters 
---------- 
pat : string 
    Character sequence or regular expression 
case : boolean, default True 
    If True, case sensitive 
flags : int, default 0 (no flags) 
    re module flags, e.g. re.IGNORECASE 
na : default NaN, fill value for missing values. 

Например:

In [11]: df = pd.DataFrame(['hello', 'world'], columns=['words']) 

In [12]: df 
Out[12]: 
    words 
0 hello 
1 world 

In [13]: df.words.str.contains(r'[hw]') 
Out[13]: 
0 True 
1 True 
Name: words, dtype: bool 

In [14]: df.words.str.contains(r'he|wo') 
Out[14]: 
0 True 
1 True 
Name: words, dtype: bool 

Для подсчета вхождений вы можете просто просуммировать булево Серия:

In [15]: df.words.str.contains(r'he|wo').sum() 
Out[15]: 2 

In [16]: df.words.str.contains(r'he').sum() 
Out[16]: 1 
+0

Это намного опрятно и, вероятно, быстрее, устраняя необходимость '' get''. –

+0

@ Энди Хайден: Предположим, я хочу, чтобы подсчет «привет» и «слово» подсчитывали и печатали «привет» count = 1 ',' "word" count = 1 "? Могу ли я сделать это в одной строке кода? –

+2

Как насчет 'word_regexs = [r'he ', r'wo']', а затем создайте серию с 'pd.Series ((df.words.str.contains (r) .sum() для r в word_regexs), word_regexs, name = 'count') '? –

3

Чтобы подсчитать общее количество матчей, используйте s.str.match(...).str.get(0).count().

Если регулярное выражение будет соответствие несколько уникальных слов, чтобы быть подсчитаны индивидуально, используйте s.str.match(...).str.get(0).groupby(lambda x: x).count()

Это работает так:

In [12]: s 
Out[12]: 
0 ax 
1 ay 
2 bx 
3 by 
4 bz 
dtype: object 

Метод match строка обрабатывает регулярные выражения ...

In [13]: s.str.match('(b[x-y]+)') 
Out[13]: 
0  [] 
1  [] 
2 (bx,) 
3 (by,) 
4  [] 
dtype: object 

... но результаты, как указано, не очень удобны. Метод Строка get принимает матчи в виде строк и преобразует пустые результаты NaNs ...

In [14]: s.str.match('(b[x-y]+)').str.get(0) 
Out[14]: 
0 NaN 
1 NaN 
2  bx 
3  by 
4 NaN 
dtype: object 

... которые не учитываются.

In [15]: s.str.match('(b[x-y]+)').str.get(0).count() 
Out[15]: 2 
+0

: Thanks Allan, pr oblem со мной не берет счет, как насчет соответствия регулярному выражению..Andy предоставил аккуратный ответ, как вы согласились .. :) –

Смежные вопросы