es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Crear una nueva columna utilizando str.contains y basándose en una condición if-else.

Tengo una lista de nombres ‘patrón’ que quiero comparar 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, dejar vacía la fila.

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 de lo contrario. Con eso, he intentado 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
)

Obtengo el error:

TypeError: ‘in ‘ requiere que la cadena sea el operando izquierdo, no una serie.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para hacer coincidir la lista de nombres ‘patrón’ con las cadenas en la columna ‘url_text’, puedes usar el método apply() en la columna ‘url_text’ con una función lambda que verifica si alguno de los nombres en ‘patrón’ está presente en la cadena. Si se encuentra una coincidencia, el nombre debe ser impreso en una nueva columna ‘pol_name_block’, y si no se encuentra, la fila debe estar vacía.

    Así es cómo puedes modificar el código:

    df['pol_name_block'] = df['url_text'].apply(
        lambda x: '|'.join(name for name in pol_names_list if name in x) if pd.notna(x) else ''
    )
    

    Explicación:

    • df['url_text'].apply() aplica una función lambda a cada valor en la columna ‘url_text’.
    • lambda x: define una función anónima que toma un argumento x. x representa cada valor de la columna ‘url_text’.
    • '|'.join(name for name in pol_names_list if name in x) verifica si alguno de los nombres en ‘pol_names_list’ está presente en la cadena x. Si se encuentra una coincidencia, los nombres se unen con el separador ‘|’ para crear una cadena.
    • if pd.notna(x) else '' verifica si el valor de x no es NaN. Si es NaN, devuelve una cadena vacía. Esto es para evitar errores como ‘TypeError: ‘float’ object is not iterable’ (‘TypeError: un objeto ‘float’ no es iterable’).
    • Por último, el resultado se almacena en la nueva columna ‘pol_name_block’.

    ¡Espero que esto ayude!

Comments are closed.