如何遍历DataFrame,按账户筛选出异常邮箱记录?
问题描述
我有如下DataFrame,其中部分邮箱无效,判断依据是同一Account Name下存在的“异类”邮箱(例如Customer A下的no@nonsense.com)。我尝试对比Account Name和Email,但卡在了如何遍历每个账户并筛选出这些异常邮箱。
我尝试的代码如下:
df['Account_Name-next'] = df['Account_Name'].shift(-1) df['Email-next'] = df['Email'].shift(-1) df['Account_Name_equ'] = df['Account_Name-next'] == df['Account_Name'] df['Email-equ'] = df['Email-next'] == df['Email'] for row in df.itertuples(): if row.Account_Name_equ == True: continue print(df['Email'][0]) if row.Account_Name_equ == False: break
解决方法
不用手动遍历行,用pandas的分组统计就能快速定位异常邮箱:
统计每个账户下各邮箱的出现次数
先按Account_Name分组,再统计每个邮箱的频次:email_counts = df.groupby(['Account_Name', 'Email']).size().reset_index(name='Count')找出每个账户下的主流邮箱(频次最高的)
对每个账户,取频次最高的邮箱作为该账户的“标准邮箱”:main_emails = email_counts.groupby('Account_Name')['Count'].idxmax() main_email_df = email_counts.loc[main_emails, ['Account_Name', 'Email']].rename(columns={'Email': 'Main_Email'})合并原数据,标记异常邮箱
将原DataFrame和主流邮箱表合并,对比每个邮箱是否和主流一致,不一致的就是异常:df_with_flag = df.merge(main_email_df, on='Account_Name', how='left') df_with_flag['Is_Invalid'] = df_with_flag['Email'] != df_with_flag['Main_Email']筛选出所有异常邮箱
直接提取标记为异常的行:invalid_emails = df_with_flag[df_with_flag['Is_Invalid']] print(invalid_emails)
如果你的场景里,只要是和该账户下大多数邮箱不同的都算异常,上面的方法完全适用。如果有特殊规则(比如邮箱域名必须和账户匹配),可以再基于这个框架调整判断逻辑。
内容的提问来源于stack exchange,提问作者Mayv
相关产品推荐
相关产品推荐

