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

如何基于Email与Region列过滤DataFrame?三种场景需求问询

解决方案

前置处理:转换Date列类型

先把字符串格式的Date转为datetime类型,避免后续操作可能出现的问题:

import pandas as pd

# 假设你的DataFrame名为df
df['Date'] = pd.to_datetime(df['Date'])

核心思路:按Email分组判断Region分布

我们需要先统计每个Email对应的所有Region,再根据分布情况分类过滤。这里提供两种实现方式:

方式一:基于Region集合判断

# 按Email分组,获取每个邮箱对应的所有唯一Region
email_region_map = df.groupby('Email')['Region'].agg(lambda x: set(x)).reset_index()

# 标记每个邮箱的类别
email_region_map['type'] = email_region_map['Region'].apply(
    lambda x: 'both' if {'Region 1', 'Region 2'}.issubset(x)
    else 'only_region1' if 'Region 1' in x
    else 'only_region2'
)

# 提取各类别对应的邮箱列表
both_emails = email_region_map[email_region_map['type'] == 'both']['Email']
only_region1_emails = email_region_map[email_region_map['type'] == 'only_region1']['Email']
only_region2_emails = email_region_map[email_region_map['type'] == 'only_region2']['Email']

方式二:基于统计计数判断

用nunique统计每个邮箱的Region数量,结合是否包含指定Region来判断:

# 按Email分组,统计Region相关指标
email_stats = df.groupby('Email').agg(
    region_num=('Region', 'nunique'),
    has_region1=('Region', lambda x: 'Region 1' in x.values),
    has_region2=('Region', lambda x: 'Region 2' in x.values)
).reset_index()

# 提取各类别对应的邮箱列表
both_emails = email_stats[email_stats['region_num'] == 2]['Email']
only_region1_emails = email_stats[email_stats['has_region1'] & ~email_stats['has_region2']]['Email']
only_region2_emails = email_stats[~email_stats['has_region1'] & email_stats['has_region2']]['Email']

三种过滤结果获取

1. 同时存在两个Region记录的Email

df_both_regions = df[df['Email'].isin(both_emails)]

2. 仅存在Region 1记录的Email

df_only_region1 = df[df['Email'].isin(only_region1_emails)]

3. 仅存在Region 2记录的Email

df_only_region2 = df[df['Email'].isin(only_region2_emails)]

内容的提问来源于stack exchange,提问作者sanminchui

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 10:55:21