使用术语列表在数据框中搜索,并添加具有该术语的新列



我有一个大数据框和一个这样的术语列表:

ID          COUNTRY     TEXT
123432      FR          En un lugar de la Mancha, de cuyo nombre no quiero 
123321      DE          No ha mucho tiempo que vivía un hidalgo de los de lanza en astillero
324221      UK          Tenía en su casa una ama que pasaba de los cuarenta, y una sobrina que no llegaba a los veinte
343212      IT          Frisaba la edad de nuestro hidalgo con los cincuenta años
431234      ES          Es, pues, de saber que este sobredicho hidalgo, los ratos que estaba ocioso -que eran los más del año-, se daba a leer libros de caballerías
123213      AU          Pero esto importa poco a nuestro cuento: basta que en la narración dél no se salga un punto de la verdad.
list_of_terms = ['hidalgo', 'años', 'Mancha' ]

list_of_terms相当大,因此,我需要一个循环来访问列表中的所有字符串。

我想获得的是一个新的数据帧,其中包含包含术语列表的行和一个名为KEYWORDS的新列,其关键字/关键字位于 TEXT 列内。

生成的数据帧将为:

ID          COUNTRY    KEYWORDS           TEXT
123432      FR         'Mancha'           En un lugar de la Mancha, de cuyo nombre no quiero 
123321      DE         'hidalgo'          No ha mucho tiempo que vivía un hidalgo de los de lanza en astillero
343212      IT         'hidalgo','años'   Frisaba la edad de nuestro hidalgo con los cincuenta años
431234      ES         'hidalgo'          Es, pues, de saber que este sobredicho hidalgo, los ratos que estaba ocioso -que eran los más del año-, se daba a leer libros de caballerías

将数据帧视为熊猫数据帧:

import numpy as np
import pandas as pd
import re
df = pd.DataFrame({'ID':['123432','123321','324221','343212','431234','123213'],
'COUNTRY': ['FR', 'DE', 'UK', 'IT', 'ES', 'AU'],
'TEXT':['En un lugar de la Mancha, de cuyo nombre no quiero ', 'No ha mucho tiempo que vivía un hidalgo de los de lanza en astillero','Tenía en su casa una ama que pasaba de los cuarenta, y una sobrina que no llegaba a los veinte', 'Frisaba la edad de nuestro hidalgo con los cincuenta años', 'Es, pues, de saber que este sobredicho hidalgo, los ratos que estaba ocioso -que eran los más del año-, se daba a leer libros de caballerías','']})
df['KEYWORDS'] = df.apply(lambda row: [el for el in list_of_terms if re.findall("\b{}\b".format(el),row.TEXT] , axis=1)
df['KEYWORDS']= df.KEYWORDS.apply(lambda row : np.nan if len(row)==0 else row)
df.dropna(subset=['KEYWORDS'], inplace=True)

以下是使用str.extractallGroupBy.agg进行聚合join的一种方法:

r = r'({})'.format('|'.join(list_of_terms))
# '(hidalgo|años|Mancha)'
df['KEYWORDS'] = (df.TEXT.str.extractall(r)
.groupby(level=0)
.agg(', '.join))
df[df.KEYWORDS.notna()]
ID COUNTRY                                               TEXT  
0  123432      FR  En un lugar de la Mancha, de cuyo nombre no qu...   
1  123321      DE  No ha mucho tiempo que vivía un hidalgo de los...   
3  343212      IT  Frisaba la edad de nuestro hidalgo con los cin...   
4  431234      ES  Es, pues, de saber que este sobredicho hidalgo...   
KEYWORDS  
0         Mancha  
1        hidalgo  
3  hidalgo, años  
4        hidalgo  

最新更新