Как лучше всего проверить электронную почту в панде данных - PullRequest
0 голосов
/ 03 мая 2018

У меня есть фрейм данных (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.

Заранее спасибо, Manuel

Ответы [ 4 ]

0 голосов
/ 03 мая 2018

Используйте 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

Другой подход с 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
0 голосов
/ 03 мая 2018

Вы можете использовать выражения регулярных выражений, чтобы найти совпадение, а затем применить применить к столбцу email, чтобы создать столбец 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.

0 голосов
/ 03 мая 2018
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
0 голосов
/ 03 мая 2018

validate_email возвращает много информации, например, smtp и т. д., а для недействительных писем выдается исключение EmailNotValidError. Вы можете написать функцию и применить к серии панд -

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...