You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 16:06:25