значения серии поиска для подстроки, если найдено, удалите строку и оставьте значение пустым - PullRequest
0 голосов
/ 13 июля 2020

ищет способ получить список ключевых слов и значений столбцов поиска для этих ключевых слов. Если ключевое слово найдено, удалите всю строку из серии и оставьте поле пустым. При поиске этого кажется, что многие хотят отбросить всю строку. Я просто хочу удалить значение ячейки столбца.

Некоторый контекст: этот столбец содержит адреса электронной почты. Иногда, если электронная почта недоступна, люди просто помещают некоторую форму (n / a, N / A, na, na@na.com, et c ...). Тем не менее, есть много способов набрать его, а также ввести с ошибкой (н / д, na@Na.c, a@n.co, n@n, et c ....). Итак, я ищу идеал, чтобы уловить все, что я могу. Я удаляю всю строку (значение).

My Logi c: Создайте список ключевых слов с различными комбинациями (может быть длинным). Если ключевое слово найдено, удалите все строковое значение.

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

Надеюсь, это имеет смысл. Пожалуйста, дайте мне знать, если вам понадобится дополнительная информация. Я ценю любую помощь, которую вы можете оказать. Заранее спасибо.

1 Ответ

0 голосов
/ 14 июля 2020

Вот как бы я это сделал.

Я бы поместил свои ключевые слова в набор, а не в кортеж, поскольку наборы имеют скорость поиска O (1). Затем я бы создал пустой список и перебирал слова и при необходимости заменял их.

### 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)

Если вы хотите выполнить foreach l oop в одной строке, вы можете использовать понимание списка, т.е.

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

Возможно, вы захотите поместить в форму какой-либо тип проверки, чтобы пользователь мог ввести только действительный адрес или просто N / A, если он недоступен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...