基于Email列对比两个DataFrame,识别新增与删除用户
问题:基于Email筛选新增/删除用户列表
我们公司每月生成两张付费应用用户数据Excel表,需以Email作为唯一标识,筛选出本月新增用户列表及上月已删除用户列表。以下是数据示例、期望输出及当前无法得到正确结果的Pandas代码:
数据示例
上月DataFrame
| UserName | Type | Number Of Licenses | |
|---|---|---|---|
| Joe Blue | joe@codeschool.co.uk | Admin | 1 |
| Rachel Green | racehel@codeschool.co.uk | User | 2 |
| Shirly Brown | shirley@codeschool.co.uk | Adimin | 1 |
| Jack Black | Jack@codeschool.co.uk | Adimin | 1 |
| Cheryl Stone | Cherylt@codeschool.co.uk | Adimin | 1 |
本月DataFrame
| UserName | Type | Number Of Licenses | |
|---|---|---|---|
| Joe Blue | joe@codeschool.co.uk | Admin | 1 |
| Rachel Green | racehel@codeschool.co.uk | User | 2 |
| Richard Red | Richard@codeschool.co.uk | Adimin | 1 |
| Jack Black | Jack@codeschool.co.uk | Adimin | 1 |
期望输出
本月新增用户(DF_Added)
| UserName | Type | Number Of Licenses | |
|---|---|---|---|
| Richard Red | Richard@codeschool.co.uk | Adimin | 1 |
上月已删除用户(DF_Removed)
| UserName | Type | Number Of Licenses | |
|---|---|---|---|
| Cheryl Stone | Cherylt@codeschool.co.uk | Adimin | 1 |
当前问题代码
LastMonth = Path.cwd() / "./tempwork/UserReport_June.xlsx" ThisMonth = Path.cwd() / "./tempwork/UserReport_July.xlsx" df_LastMonth = pd.read_excel(LastMonth) df_ThisMonth = pd.read_excel(ThisMonth) df_changed = pd.merge(df_LastMonth, df_ThisMonth, on="Email", how='outer', indicator='Exist') df_changed = df_changed.loc[df_changed['Exist'] != 'both'] df_changed.to_excel("./tempwork/changed.xlsx")
解决方案
原代码的问题在于外连接后会生成带_x/_y后缀的重复列,且未拆分新增/删除用户列表,导致输出结构混乱。以下是修正后的代码:
from pathlib import Path import pandas as pd LastMonth = Path.cwd() / "./tempwork/UserReport_June.xlsx" ThisMonth = Path.cwd() / "./tempwork/UserReport_July.xlsx" df_LastMonth = pd.read_excel(LastMonth) df_ThisMonth = pd.read_excel(ThisMonth) # 外连接并标记用户存在状态 df_changed = pd.merge(df_LastMonth, df_ThisMonth, on="Email", how='outer', indicator='Exist') # 提取上月存在、本月不存在的删除用户,保留上月数据 df_Removed = df_changed[df_changed['Exist'] == 'left_only'].rename(columns={ 'UserName_x': 'UserName', 'Type_x': 'Type', 'Number Of Licenses_x': 'Number Of Licenses' })[['UserName', 'Email', 'Type', 'Number Of Licenses']] # 提取本月存在、上月不存在的新增用户,保留本月数据 df_Added = df_changed[df_changed['Exist'] == 'right_only'].rename(columns={ 'UserName_y': 'UserName', 'Type_y': 'Type', 'Number Of Licenses_y': 'Number Of Licenses' })[['UserName', 'Email', 'Type', 'Number Of Licenses']] # 分别导出结果 df_Added.to_excel("./tempwork/added_users.xlsx", index=False) df_Removed.to_excel("./tempwork/removed_users.xlsx", index=False)
说明
- 通过
Exist列的left_only筛选出上月有、本月无的删除用户,保留上月的用户字段; - 通过
right_only筛选出本月有、上月无的新增用户,保留本月的用户字段; - 重命名列并保留需要的字段,确保输出结构与期望一致;
- 分别导出新增和删除用户列表到独立文件,便于后续使用。
内容的提问来源于stack exchange,提问作者Dinerz
相关产品推荐
相关产品推荐

