搜索子字符串的系列值,如果找到,则删除字符串并将值保留为空白

时间:2020-07-13 19:48:40

标签: python pandas

寻找一种具有关键字列表和这些关键字的搜索列值的方法。如果找到关键字,则从系列中删除整个字符串,并留空。在搜索时,似乎很多人希望删除整行。我只想删除列单元格值。

某些上下文: 此列包含电子邮件地址。有时,如果无法使用电子邮件,那么人们只需输入某种形式(不适用,不适用,不适用,na @ na.com等)。但是,有很多方法可以键入和错误键入(n / A,na @ Na.c,a @ n.co,n @ n等)。因此,我正在寻找一种理想的方法来捕获所有我可以删除的整个字符串(值)。

我的逻辑:创建一个不同组合的关键字列表(可能很长)。如果找到了关键字,则删除所有字符串值。

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 :(得分:0)

这就是我要怎么做。

由于集具有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循环,则可以使用列表理解功能,即

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

您可能希望在表单上进行某种类型的验证,以便用户只能输入有效地址,或者如果不可用,则只能输入N / A。