寻找一种具有关键字列表和这些关键字的搜索列值的方法。如果找到关键字,则从系列中删除整个字符串,并留空。在搜索时,似乎很多人希望删除整行。我只想删除列单元格值。
某些上下文: 此列包含电子邮件地址。有时,如果无法使用电子邮件,那么人们只需输入某种形式(不适用,不适用,不适用,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
希望这很有道理。如果您需要更多信息,请告诉我。感谢您提供的任何帮助。预先感谢。
答案 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。