如何在Python中按月份分组并统计唯一用户数?
解决方案
你的原始DataFrame如下:
| 日期 | 用户ID |
|---|---|
| 2006-02-13 | 1 |
| 2006-02-14 | 2 |
| 2006-03-02 | 1 |
| 2006-02-22 | 1 |
| 2006-03-30 | 3 |
| 2006-04-01 | 1 |
| 2006-04-02 | 2 |
| 2006-04-01 | 2 |
| 2006-04-05 | 3 |
你期望的输出是按月份英文全称统计唯一用户数:
| 日期 | 唯一用户数 |
|---|---|
| February | 2 |
| March | 2 |
| April | 3 |
你的代码问题
你之前的代码mau = mau.groupby([mau.timestamp.dt.to_period('M'), 'userid'])存在两个核心问题:
- 同时按月份和用户ID分组,这会把每个用户在每个月的记录单独拆分,无法统计每月的唯一用户总数
- 仅执行了分组操作,没有添加聚合统计函数(比如
nunique()),因此得到的只是分组对象,没有生成实际的统计结果
正确实现步骤
1. 确保日期列是datetime类型
如果你的日期列还不是datetime格式,先做类型转换:
import pandas as pd df['日期'] = pd.to_datetime(df['日期'])
2. 提取月份英文全称
从日期列中提取月份的英文名称:
df['月份'] = df['日期'].dt.month_name()
3. 分组统计唯一用户数
按月份分组,对用户ID列统计唯一值数量,最后重命名列名匹配你的期望输出:
result = df.groupby('月份')['用户ID'].nunique().reset_index() result.columns = ['日期', '唯一用户数']
一步到位的简洁写法
result = (df .assign(月份=pd.to_datetime(df['日期']).dt.month_name()) .groupby('月份')['用户ID'] .nunique() .reset_index() .rename(columns={'月份': '日期', '用户ID': '唯一用户数'}))
执行后得到的result就是你需要的输出结果。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

