如何基于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
相关产品推荐
相关产品推荐

