Buscando una manera de tener una lista de palabras clave y valores de columnas de búsqueda para estas palabras clave. Si se encuentra una palabra clave, elimine toda la cadena de la serie y déjela en blanco. Al buscar esto, parece que muchos quieren eliminar toda la fila. Solo quiero eliminar el valor de la celda de la columna.

Algún contexto: esta columna contiene direcciones de correo electrónico. A veces, si el correo electrónico no está disponible, la gente simplemente pone alguna forma de (n / a, N / A, na, na@na.com, etc ...). Sin embargo, hay muchas formas en que esto se puede escribir y también se puede escribir incorrectamente (n / A, na@Na.c, a@n.co, n @ n, etc.). Entonces, estoy buscando un ideal para capturar todo lo que pueda, elimino toda la cadena (valor).

Mi lógica: crea una lista de palabras clave de diferentes combinaciones (podría ser larga). Si se encuentra la palabra clave, elimine todo el valor de la cadena.

keywords = ('na@', 'na.c', 'na@na.c', 'n@n', 'na@na.com', 'NA@')
df['column1'] = df['column1'].str.contains(keywords,"")


# This works but is going to take out a bunch of chained replace statements to get each item.
# also just removes keyword and might have extra characters left in string.
cols = ["column1","column2","column3"]
df[cols] = df[cols].replace('n/a', '').replace('N/A', '').replace('na@na.com', '')


# Works but just handles two conditions only 'na' & 'NA'
df['column1'] = df['column1'].str.replace(r'na',"", case=False)



Starting with:                   Finished:
column1                          column1
tom@gm.com                       tom@gm.com
na@na.com                        
n@n                                 
hazy@aol.com                     hazy@aol.com
n@.co                            
d88@yah.com                      d88@yah.com
a@na                             
nA@                              
chip@gm.com                      chip@gm.com

Espero que esto tenga algún sentido. Por favor, avíseme si necesita más información. Agradezco cualquier ayuda que pueda brindar. Gracias por adelantado.

0
Boomer 13 jul. 2020 a las 22:48

1 respuesta

La mejor respuesta

Así es como lo haría.

Colocaría mis palabras clave dentro de un conjunto en lugar de una tupla, ya que los conjuntos tienen una velocidad de búsqueda de O (1). Luego crearía una lista vacía e iteraría a través de las palabras y las reemplazaría si fuera necesario.

### This is to replicate your scenario

import pandas as pd


keywords = {'na@', 'na.c', 'na@na.c', 'n@n', 'na@na.com', 'NA@', "a@na", "nA@"}
column1 = {"column1": ["tom@gm.com", "na@na.com", "n@n",
                       "hazy@aol.com", "n@.co", "d88@yah.com",
                       "a@na", "nA@", "chip@gm.com"]}

df = pd.DataFrame(data=column1)

### End

# ACTUAL CODE
# this is where we will store the newly created words
replaced_emails = []
for email in df["column1"]:
    if email in keywords:
        # email is not valid therefore replace the invalid email with ""
        clear_email = email.replace(email, "")
        replaced_emails.append(clear_email)
    else:
        # valid email
        replaced_emails.append(email)
df["column1"] = replaced_emails

print(df)

Si desea hacer el bucle foreach en una línea, puede usar la comprensión de listas, es decir,

df["column1"] = [email.replace(email, "") if email in keywords else email for email in df["column1"]]

Es posible que desee poner algún tipo de validación en el formulario para que el usuario solo pueda ingresar una dirección válida o simplemente N / A si no hay una disponible

0
RamWill 14 jul. 2020 a las 15:17