我如何最好地验证熊猫数据框中的电子邮件

Man*_*uel 1 python email validation dataframe pandas

我有一个包含电子邮件和数字的数据框 (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
Run Code Online (Sandbox Code Playgroud)

我需要过滤所有电子邮件正确且欧元等于或大于 100 的行,以及另一个电子邮件正确且欧元小于 100 的列表。我知道我可以像这样按欧元过滤

df_gt_100 = df.euro >= 100
Run Code Online (Sandbox Code Playgroud)

df_lt_100 = df.euro < 100
Run Code Online (Sandbox Code Playgroud)

但我找不到过滤电子邮件地址的方法。我导入了 email_validate 包并尝试了这样的事情

validate_email(df.email)
Run Code Online (Sandbox Code Playgroud)

这给了我一个 TypeError: expected string or bytes-like object。

任何人都可以给我一个提示如何解决这个问题。如果我可以使用 AND 和 OR 运算符在一个过滤器中完成所有这些,那就太好了。

提前致谢,曼努埃尔

jez*_*ael 6

使用apply, 链掩码&forAND和 filter by 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
Run Code Online (Sandbox Code Playgroud)

使用regex和的另一种方法contains

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
Run Code Online (Sandbox Code Playgroud)


Ami*_*uri 5

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
Run Code Online (Sandbox Code Playgroud)