Tengo una lista de nombres 'patrón' que deseo hacer coincidir con cadenas en la columna 'url_text'. Si hay una coincidencia, es decir, True , el nombre debe imprimirse en una nueva columna 'pol_names_block' y si es False , deje la fila vacía.
pattern = '|'.join(pol_names_list) print(pattern) 'Jon Kyl|Doug Jones|Tim Kaine|Lindsey Graham|Cory Booker|Kamala Harris|Orrin Hatch|Bernie Sanders|Thom Tillis|Jerry Moran|Shelly Moore Capito|Maggie Hassan|Tom Carper|Martin Heinrich|Steve Daines|Pat Toomey|Todd Young|Bill Nelson|John Barrasso|Chris Murphy|Mike Rounds|Mike Crapo|John Thune|John. McCain|Susan Collins|Patty Murray|Dianne Feinstein|Claire McCaskill|Lamar Alexander|Jack Reed|Chuck Grassley|Catherine Masto|Pat Roberts|Ben Cardin|Dean Heller|Ron Wyden|Dick Durbin|Jeanne Shaheen|Tammy Duckworth|Sheldon Whitehouse|Tom Cotton|Sherrod Brown|Bob Corker|Tom Udall|Mitch McConnell|James Lankford|Ted Cruz|Mike Enzi|Gary Peters|Jeff Flake|Johnny Isakson|Jim Inhofe|Lindsey Graham|Marco Rubio|Angus King|Kirsten Gillibrand|Bob Casey|Chris Van Hollen|Thad Cochran|Richard Burr|Rob Portman|Jon Tester|Bob Menendez|John Boozman|Mazie Hirono|Joe Manchin|Deb Fischer|Michael Bennet|Debbie Stabenow|Ben Sasse|Brian Schatz|Jim Risch|Mike Lee|Elizabeth Warren|Richard Blumenthal|David Perdue|Al Franken|Bill Cassidy|Cory Gardner|Lisa Murkowski|Maria Cantwell|Tammy Baldwin|Joe Donnelly|Roger Wicker|Amy Klobuchar|Joel Heitkamp|Joni Ernst|Chris Coons|Mark Warner|John Cornyn|Ron Johnson|Patrick Leahy|Chuck Schumer|John Kennedy|Jeff Merkley|Roy Blunt|Richard Shelby|John Hoeven|Rand Paul|Dan Sullivan|Tim Scott|Ed Markey' Estoy usando el siguiente código df['url_text'].str.contains(pattern) que da como resultado True en caso de que un nombre en 'pattern' esté presente en una fila en la columna 'url_text' y False en caso contrario. Con eso he probado el siguiente código:
df['pol_name_block'] = df.apply( lambda row: pol_names_list if df['url_text'].str.contains(pattern) in row['url_text'] else ' ', axis=1 )me sale el error:
TypeError: 'in <string>' requires string as left operand, not SeriesDe este marco de datos de juguete:
>>> import pandas as pd >>> from io import StringIO >>> df = pd.read_csv(StringIO(""" ... id,url_text ... 1,Tim Kaine ... 2,Tim Kain ... 3,Tim ... 4,Lindsey Graham.com ... """), sep=',') >>> df id url_text 0 1 Tim Kaine 1 2 Tim Kain 2 3 Tim 3 4 Lindsey Graham.com A partir de pol_names_list , construimos patterns al formatearlos así:
patterns = '(%s)' % '|'.join(pol_names_list) Luego, podemos usar el método de extract para asignar el valor a la columna pol_name_block para obtener el resultado esperado:
df['pol_name_block'] = df['url_text'].str.extract(patterns)Producción :
id url_text pol_name_block 0 1 Tim Kaine Tim Kaine 1 2 Tim Kain NaN 2 3 Tim NaN 3 4 Lindsey Graham.com Lindsey GrahamCambie su patrón para encerrarlo alrededor de un grupo de captura () y use extract :
pattern = fr"({'|'.join(pol_names_list)})" df['pol_name_block'] = df['url_text'].str.extract(pattern) print(df) # Output <- with the sample of @tlentali id url_text pol_name_block 0 1 Tim Kaine Tim Kaine 1 2 Tim Kain NaN 2 3 Tim NaN 3 4 Lindsey Graham Lindsey Graham Importante : puede extraer solo un elemento incluso si hay varias coincidencias. Si desea extraer todos los elementos, debe usar findall o extractall (solo cambiará el formato de salida)
# New sample, same pattern >>> df id url_text 0 1 Tim Kaine and Lindsey Graham 1 2 Tim Kain 2 3 Tim 3 4 Lindsey Graham # findall >>> df['url_text'].str.findall(pattern) 0 [Tim Kaine, Lindsey Graham] 1 [] 2 [] 3 [Lindsey Graham] Name: url_text, dtype: object # extractall >>> df['url_text'].str.extractall(pattern) 0 match 0 0 Tim Kaine 1 Lindsey Graham 3 0 Lindsey Graham