Фильтруйте Pandas Dataframe, удаляя соответствующие почтовые домены из нескольких столбцов - PullRequest
0 голосов
/ 13 октября 2019

У меня есть этот фрейм данных: я хочу отфильтровать строки, в которых домены в столбце «Email__c» соответствуют доменам из столбцов «Internal_Email» или «Alt_Email». Например, в первой строке подстрока / домен «compx» из «doug@compx.com» соответствует подстроке / домену в «ruda@compx.com» и «sales@compx.com», поэтому я хочу, чтобы эта строкабыть отфильтрованы. Все строки в приведенном ниже кадре данных должны быть отфильтрованы.

Company        Email__c      Action      Internal_Email            Alt_Email
CompX     doug@compx.com      View        ruda@compx.com        sales@compx.com
Doit Inc  try@doit.com.au     View        pop@doit.com          info@doit.com
PIA       mbosi@pia.com       Sell        voss@pia.com          info@pia.com
Techy     pat@techy.com.br    Buy       tra@techy.com.br        contat@techy.com.br
Techy     pat@techy.com.br    Buy       tra@techy.com.br        contat@techy.com.br

Ответы [ 3 ]

1 голос
/ 13 октября 2019

Попробуйте это

s1 = df.Email__c.str.findall(r'@(\w+).')
s2 = df.Internal_Email.str.findall(r'@(\w+).')
s3 = df.Alt_Email.str.findall(r'@(\w+).')

df[s1.ne(s2) & s1.ne(s3)]
0 голосов
/ 13 октября 2019

Я думаю, вы хотите что-то вроде этого:

df = pd.read_csv('data.csv', sep=';'). # i just save your data in csv and read it then
df

out:

    Company Email__c    Action  Internal_Email  Alt_Email
0   CompX   doug@compx.com  View    ruda@compx.com  sales@compx.com
1   Doit Inc    try@doit.com.au View    pop@doit.com    info@doit.com
2   PIA mbosi@pia.com   Sell    voss@pia1.com   info@pia.com
3   Techy   pat@techy.com.br    Buy tra@techy.com.br    contat@techy1.com.br
4   Techy   pat@techy.com.br    Buy tra@techy.com.br    contat@techy.com.br

Условия обработки:

df['email_c_domain'] = [x.split('@')[1] for x in df['Email__c']]   # make additional column with only domain
df['filter_out_1'] = [x.split('@')[1] for x in df['Internal_Email']] # make additional column with only domain 
df['filter_out_2'] = [x.split('@')[1] for x in df['Alt_Email']] # make additional column with only domain 
df['match_1'] = (df['email_c_domain'] == (df['filter_out_1'])) # match domains from email_c to Internal_email
df['match_2'] = (df['email_c_domain'] == (df['filter_out_2']))  # match domains from email_c to Alt_email
df['filtered_out'] = df['match_1'] | df['match_2'] # chose if one of match will true

Теперь df выглядит так:

    Company Email__c    Action  Internal_Email  Alt_Email   email_c_domain  filter_out_1    filter_out_2    match_1 match_2 filtered_out
0   CompX   doug@compx.com  View    ruda@compx.com  sales@compx.com compx.com   compx.com   compx.com   True    True    True
1   Doit Inc    try@doit.com.au View    pop@doit.com    info@doit.com   doit.com.au doit.com    doit.com    False   False   False
2   PIA mbosi@pia.com   Sell    voss@pia1.com   info@pia.com    pia.com pia1.com    pia.com False   True    True
3   Techy   pat@techy.com.br    Buy tra@techy.com.br    contat@techy1.com.br    techy.com.br    techy.com.br    techy1.com.br   True    False   True
4   Techy   pat@techy.com.br    Buy tra@techy.com.br    contat@techy.com.br techy.com.br    techy.com.br    techy.com.br    True    True    True

А теперь давайте отфильтруем его:

df[df['filtered_out'] == False]

Вывод:

     Company        Email__c    Action  Internal_Email  Alt_Email   email_c_domain  filter_out_1    filter_out_2    match_1 match_2 filtered_out
1   Doit Inc    try@doit.com.au View    pop@doit.com    info@doit.com   doit.com.au doit.com    doit.com    False   False   False
0 голосов
/ 13 октября 2019

Попробуйте:

df.loc[~((df["Email__c"].apply(lambda x: x.split("@")[1]) == df["Internal_Email"].apply(lambda x: x.split("@")[1])) | (df["Email__c"].apply(lambda x: x.split("@")[1]) == df["Alt_Email"].apply(lambda x: x.split("@")[1])))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...