如何在pandas数据框中最好地验证电子邮件

时间:2018-05-03 06:56:34

标签: python pandas validation email dataframe

我有一个数据框(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运算符在一个过滤器中完成所有操作,那就太好了。

提前致谢, 曼努埃尔

4 个答案:

答案 0 :(得分:4)

&使用applyAND的链掩码,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

使用regexcontains的另一种方法:

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列进行过滤。