将唯一分类器添加到 python 3 中的列表时避免笛卡尔

Avoiding cartesian when adding unique classifier to a list in python 3

我有 5 个要导入的 .csv 文件,它们都包含电子邮件:

Donors = pd.read_csv(r"C:\Users\am\Desktop\email parsing\Q1 2021\Donors Q1 2021 R12.csv",
                        usecols=["Email Address"])
Activists = pd.read_csv(r"C:\Users\am\Desktop\email parsing\Q1 2021\Activists Q1 2021 R12.csv",
                        usecols=["Email"])
Low_Level_Activists = pd.read_csv(r"C:\Users\am\Desktop\email parsing\Q1 2021\Low Level Activists Q1 2021 R12.csv",
                        usecols=["Email"]) 
Ambassadors = pd.read_csv(r"C:\Users\am\Desktop\email parsing\Q1 2021\Ambassadors Q1 2021.csv",
                        usecols=["Email Address"])
Volunteers = pd.read_csv(r"C:\Users\am\Desktop\email parsing\Q1 2021\Volunteers Q1 2021 R12.csv",
                        usecols=["Email Address"])
 Followers= pd.read_csv(r"C:\Users\am\Desktop\email parsing\Q1 2021\Followers Q1 2021 R12.csv",
                        usecols=["Email"])

虽然我只导入电子邮件(由于它们源自的系统而使用两种不同的命名约定,这很烦人),但我将导入名称添加为分类器 - 即捐赠者、志愿者等

Donors['Value'] = "Donors"
Activists['Value'] = "Activists"
Low_Level_Activists['Value'] = "Low_Level_Activists"
Ambassadors['Value'] = "Ambassadors"
Volunteers['Value'] = "Volunteers"
Advocates['Value'] = 'Followers'

然后我连接所有文件并处理命名问题。我确信有一种更优雅的方法可以做到这一点,但这是我所拥有的:

S1= pd.concat([Donors,Activists,Low_Level_Activists,Ambassadors,Volunteers,Advocates], ignore_index= True) 
S1['Handle'] = S1['Email Address'].where(S1['Email Address'].notnull(), S1['Email'])
S1= S1.drop(['Email','Email Address'], axis = 1)
print(S1['Handle'].count()) #checks full count

最后一行的总数是 166,749

这是我的问题。我需要过滤电子邮件的唯一性——使用 .nuniques() 很容易,但我遇到的问题是我还需要携带分类器。因此,如果一封电子邮件既是捐助者又是活动家,当我尝试将唯一值与分类器合并时,我会同时提取两者。

我已经处理这个问题好几个小时了(一直到 Internet 的尽头!),但似乎找不到可行的解决方案。我已经尝试过无限循环、合并等字典。唯一的电子邮件数是 165,923(通过 Python &/or excel:( ).

本质上,我想在比赛中拉出我列表中最早的分类器。因此,如果电子邮件是捐助者和活动家-> 称他们为捐助者。或者,如果一封电子邮件是志愿者和追随者 -> 在一条电子邮件记录中称他们为志愿者。

如有任何帮助,我们将不胜感激。

我会用一些虚构的数据试一试:

import pandas as pd

fa = pd.DataFrame([['paul@mail.com', 'Donors'], ['max@mail.com', 'Donors']], columns=['Handle', 'Value'])
fb = pd.DataFrame([['paul@mail.com', 'Activists'], ['annie@mail.com', 'Activists']], columns=['Handle', 'Value'])
S1 = pd.concat([fa, fb])
print(S1)

给予

           Handle      Value
0   paul@mail.com     Donors
1    max@mail.com     Donors
0   paul@mail.com  Activists
1  annie@mail.com  Activists

您可以按 Handle 分组,然后选择您喜欢的 Value,例如第一个:

for handle, group in S1.groupby('Handle'):
    print(handle, group.reset_index().loc[0, 'Value'])

给予

annie@mail.com Activists
max@mail.com Donors
paul@mail.com Donors

或收集一个人的所有角色:

for handle, group in S1.groupby('Handle'):
    print(handle, group.Value.unique())

给予

annie@mail.com ['Activists']
max@mail.com ['Donors']
paul@mail.com ['Donors' 'Activists']