Pandas按月份分组统计新增独立用户数的实现方法
Pandas 月度新增独立用户数统计实现
需求背景
现有按月份Month分组的DataFrame,样例构建代码如下:
import pandas as pd df = pd.DataFrame({'Month': [2, 2, 3, 3], 'user': ['Michael', 'Michael', 'Lea', 'Michael']})
对应数据样例:
Month user 0 2 Michael 1 2 Michael 2 3 Lea 3 3 Michael
需要统计两个指标:
- 每月总独立用户数
- 每月新增独立用户数:仅统计当月首次在全量数据中出现的用户,历史月份已出现过的用户不计入
其中每月总独立用户数可通过现有代码实现:
df.groupby(['Month'])['user'].nunique()
运行结果:
Month 2 1 3 2
预期新增独立用户数的输出结果:
Month Unique_Count_New_Users 0 2 1 1 3 1 # 相比2月Lea是新用户,Michael不是
补充测试样例
为验证全量历史匹配的逻辑,使用更复杂的测试数据集:
import pandas as pd df = pd.DataFrame({'Month':[2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4], 'user':['Michael', 'Michael', 'Markus', 'Moritz', 'Lea', 'Michael', 'Stefan', 'Dora', 'Erika', 'Dora', 'Markus']})
对应数据样例:
Month user 0 2 Michael 1 2 Michael 2 2 Markus 3 2 Moritz 4 2 Lea 5 3 Michael 6 3 Stefan 7 3 Dora 8 3 Erika 9 4 Dora 10 4 Markus
实现方案
不需要逐分组做复杂的逐元素对比,通过Pandas内置的重复值标记方法即可实现,核心逻辑是:先按月份排序保证时间顺序,再标记用户第一次出现的记录,最后按月份统计首次出现的用户数量即可。
# 首先对DataFrame按月份排序,保证时间顺序正确 df.sort_values(by='Month', inplace=True) # 统计每月总独立用户数 monthly_total_unique = df.groupby(['Month'])['user'].nunique() # 统计每月新增独立用户数:~ 为取反运算符,duplicated()会标记重复出现的用户,取反后首次出现的用户为True,按月份求和即可 monthly_new_unique = (~df['user'].duplicated()).groupby(df['Month']).sum()
运行补充测试样例的新增用户统计结果:
Month 2 4 3 3 4 0
完全符合预期:2月4个用户都是首次出现,3月新增Stefan、Dora、Erika3个新用户,4月的两个用户都在之前月份出现过,新增数为0。
内容的提问来源于stack exchange,提问作者steff9488
相关产品推荐
相关产品推荐

