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 运算符在一个过滤器中完成所有这些,那就太好了。
提前致谢,曼努埃尔
使用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)
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)
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)