将唯一分类器添加到 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']
我有 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']