Contar las ocurrencias de ciertas palabras en el dataframe de pandas

Quiero contar el número de apariciones de ciertas palabras en un dataframe. Sé que uso “str.contains”

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

Actualmente estoy usando el código anterior. ¿Existe un método para hacer coincidir expresiones regulares y obtener el recuento de ocurrencias? En mi caso, tengo un gran dataframe y quiero hacer coincidir unas 100 cadenas.

Actualización: la respuesta original cuenta las filas que contienen una subclasificación.

Para contar todas las ocurrencias de una subcadena puede usar .str.count :

 In [21]: df = pd.DataFrame(['hello', 'world', 'hehe'], columns=['words']) In [22]: df.words.str.count("he|wo") Out[22]: 0 1 1 1 2 2 Name: words, dtype: int64 In [23]: df.words.str.count("he|wo").sum() Out[23]: 4 

El método str.contains acepta una expresión regular:

 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, eg re.IGNORECASE na : default NaN, fill value for missing values. 

Por ejemplo:

 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 

Para contar las ocurrencias puedes simplemente sumr esta serie booleana:

 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 

Para contar el número total de coincidencias, use s.str.match(...).str.get(0).count() .

Si su expresión regular coincidirá con varias palabras únicas, para ser contadas individualmente, use s.str.match(...).str.get(0).groupby(lambda x: x).count()

Funciona así:

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

El método de cadena de match maneja expresiones regulares …

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

… pero los resultados, según lo dado, no son muy convenientes. El método de cadena get toma las coincidencias como cadenas y convierte los resultados vacíos a NaNs …

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

… que no se cuentan.

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