I have a dataframe of news headlines, like this:
df = pd.DataFrame({'texto': ['El Hubble registró imágenes de una "mariposa interestelar"',
'Con su Audi atropelló y mató a una pareja: lo juzgan y podrían darle 25 años',
'Clarín cumplió 70 años y lo celebró con su personal',
'A diez años de Katrina, Obama visitó Nueva Orleans y celebró la recuperación',
'La oposición volvió a juntarse y pidió la boleta única electrónica en octubre',
'Hallan a casi 50 “sin papeles” muertos en un camión en Austria'],
'id': [1,2,3,4,5,6]})
df['texto'] = df['texto'].str.lower()
searchwords = ['hubble','audi','obama','clarín','austria']
And I am trying to search if each and every single of some keywords selected appear in above dataframe to create a new one. I have tried 'startswith'
, but only contains the sentences where the keyowrds are first.
Code:
df = df[df['texto'].str.startswith(tuple(searchwords))]
Output:
clarín cumplió 70 años y lo celebró con su per... 3
Do you know a way to create a pandas line or a function to create a filter like this?
Thanks!
CodePudding user response:
Use
df2 = df[df['texto'].str.contains('|'.join(searchwords))]
CodePudding user response:
another option to do so (without vectorization hence less efficient) is:
def serach_term(texto, terms):
if any([t in texto for t in terms]):
return True
return False
and
df['exists'] = df.apply(lambda x: serach_term(x['texto'],searchwords), axis=1)
desired result: [![enter image description here][1]][1]
you gain control on the function and can adjust accordingly BUT you move row by row and it's relatively slower.
texto id exists
0 el hubble registró imágenes de una "mariposa i... 1 True
1 con su audi atropelló y mató a una pareja: lo ... 2 True
2 clarín cumplió 70 años y lo celebró con su per... 3 True
3 a diez años de katrina, obama visitó nueva orl... 4 True
4 la oposición volvió a juntarse y pidió la bole... 5 False
5 hallan a casi 50 “sin papeles” muertos en un c... 6 True