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

基于Email列对比两个DataFrame,识别新增与删除用户

问题:基于Email筛选新增/删除用户列表

我们公司每月生成两张付费应用用户数据Excel表,需以Email作为唯一标识,筛选出本月新增用户列表及上月已删除用户列表。以下是数据示例、期望输出及当前无法得到正确结果的Pandas代码:

数据示例

上月DataFrame

UserNameEmailTypeNumber Of Licenses
Joe Bluejoe@codeschool.co.ukAdmin1
Rachel Greenracehel@codeschool.co.ukUser2
Shirly Brownshirley@codeschool.co.ukAdimin1
Jack BlackJack@codeschool.co.ukAdimin1
Cheryl StoneCherylt@codeschool.co.ukAdimin1

本月DataFrame

UserNameEmailTypeNumber Of Licenses
Joe Bluejoe@codeschool.co.ukAdmin1
Rachel Greenracehel@codeschool.co.ukUser2
Richard RedRichard@codeschool.co.ukAdimin1
Jack BlackJack@codeschool.co.ukAdimin1

期望输出

本月新增用户(DF_Added)

UserNameEmailTypeNumber Of Licenses
Richard RedRichard@codeschool.co.ukAdimin1

上月已删除用户(DF_Removed)

UserNameEmailTypeNumber Of Licenses
Cheryl StoneCherylt@codeschool.co.ukAdimin1

当前问题代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 01:38:34