我有一个数据框(df),上面有电子邮件和数字,如
email euro
0 firstname@firstdomain.com 150
1 secondname@seconddomain.com 50
2 thirdname@thirddomain.com 300
3 kjfslkfj 0
4 fourthname@fourthdomain.com 200
我需要使用正确的电子邮件和欧元等于或大于100来过滤所有行,并使用正确的电子邮件和低于100的欧元过滤另一个列表。我知道我可以按照这样的欧元过滤
df_gt_100 = df.euro >= 100
和
df_lt_100 = df.euro < 100
但我无法找到过滤电子邮件地址的方法。我导入了email_validate包并尝试了这样的事情
validate_email(df.email)
它给了我一个TypeError:期望的字符串或类似字节的对象。
任何人都可以给我一个暗示如何解决这个问题。如果我可以使用AND和OR运算符在一个过滤器中完成所有操作,那就太好了。
提前致谢, 曼努埃尔
答案 0 :(得分:4)
&
使用apply
,AND
的链掩码,boolean indexing
过滤:
from validate_email import validate_email
df1 = df[(df['euro'] > 100) & df['email'].apply(validate_email)]
print (df1)
email euro
0 firstname@firstdomain.com 150
2 thirdname@thirddomain.com 300
4 fourthname@fourthdomain.com 200
df1 = df[(df['euro'] > 100) &df['email'].str.contains(r'[^@]+@[^@]+\.[^@]+')]
print (df1)
email euro
0 firstname@firstdomain.com 150
2 thirdname@thirddomain.com 300
4 fourthname@fourthdomain.com 200
答案 1 :(得分:3)
In [30]: from validate_email import validate_email
In [31]: df
Out[31]:
email
0 firstname@firstdomain.com
1 kjfslkfj
In [32]: df['is_valid_email'] = df['email'].apply(lambda x:validate_email(x))
In [33]: df
Out[33]:
email is_valid_email
0 firstname@firstdomain.com True
1 kjfslkfj False
In [34]: df['email'][df['is_valid_email']]
Out[34]:
0 firstname@firstdomain.com
答案 2 :(得分:1)
validate_email
会返回大量信息,例如smtp等,对于无效的电子邮件,它会引发EmailNotValidError
异常。您可以编写一个函数,并应用于pandas系列 -
from email_validator import validate_email, EmailNotValidError
def validate_e(x):
try:
v = validate_email(x)
return True
except EmailNotValidError as e:
return False
df["Email_validate"] = df['email'].apply(validate_e)
答案 3 :(得分:1)
您可以使用正则表达式查找匹配项,然后在email
列上使用apply来创建电子邮件存在位置的T / F列:
import re
import pandas as pd
pattern = re.compile(r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)") # this is the regex expression to search on
df = pd.DataFrame({'email': ['firstname@domain.com', 'avicii@heaven.com', 'this.is.a.dot@email.com', 'email1234@112.com', 'notanemail'], 'euro': [123, 321, 150, 0, 133]})
df['isemail'] = df['email'].apply(lambda x: True if pattern.match(x) else False)
结果:
email euro isemail
0 firstname@domain.com 123 True
1 avicii@heaven.com 321 True
2 this.is.a.dot@email.com 150 True
3 email1234@112.com 0 True
4 notanemail 133 False
现在,您可以对isemail
列进行过滤。