基于两列过滤Pandas DataFrame:筛选跨年度唯一邮箱记录
Pandas筛选跨年份存在的邮箱记录
给定如下初始DataFrame:
import pandas as pd df_current = pd.DataFrame({ 'Email': ['Bob_Jones@gmail.com', 'Mike_Smith@gmail.com', 'Mike_Smith@gmail.com', 'Bob_Jones@gmail.com'], 'Tickets Sold': [1, 2, 1, 1], 'Year': ['2022', '2023', '2023', '2023'] })
需要筛选出同时在2022和2023年都有记录的邮箱,并保留这些邮箱的所有原始记录,最终得到目标DataFrame:
df_desired = pd.DataFrame({ 'Email': ['Bob_Jones@gmail.com', 'Bob_Jones@gmail.com'], 'Tickets Sold': [1, 1], 'Year': ['2022', '2023'] })
实现方法
方法一:分组验证年份集合
通过分组邮箱,检查每个邮箱的年份是否同时包含2022和2023:
# 获取符合条件的邮箱列表 valid_emails = ( df_current.groupby('Email')['Year'] .apply(lambda years: {'2022', '2023'}.issubset(years)) .loc[lambda x: x] # 筛选出结果为True的邮箱 .index ) # 过滤原DataFrame df_desired = df_current[df_current['Email'].isin(valid_emails)]
方法二:取两年邮箱的交集
先分别提取2022和2023年的邮箱集合,再取交集进行过滤:
# 提取各年份的唯一邮箱 emails_2022 = df_current[df_current['Year'] == '2022']['Email'].unique() emails_2023 = df_current[df_current['Year'] == '2023']['Email'].unique() # 取两个年份都存在的邮箱 valid_emails = set(emails_2022) & set(emails_2023) # 过滤原DataFrame df_desired = df_current[df_current['Email'].isin(valid_emails)]
两种方法都能得到目标结果,可根据个人习惯选择。
内容的提问来源于stack exchange,提问作者Cummins070
相关产品推荐
相关产品推荐

