我有一个大数据框和一个这样的术语列表:
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.extractall
和GroupBy.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