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

如何让Pandas的value_counts()同时输出对应标识条目与计数值

Pandas按时间周期统计计数实现方案

问题场景

现有如下记录Assay检测信息的数据集,需要统计每月完成的检测数量:

type,"Date Tested"
Assay,2022/01/28
Assay,2022/01/31
Assay,2022/02/02
Assay,2022/03/31
Assay,2022/04/21
Assay,2022/05/12
Assay,2022/06/02
Assay,2022/02/03
Assay,2022/06/03

初始实现方案直接提取日期中的月份数字做value_counts()统计:

import pandas as pd
data['Date Tested']=pd.to_datetime(data['Date Tested'], format = "%Y/%m/%d")
months = data['Date Tested'].dt.month.value_counts(sort=False)
print(months)

运行输出如下:

1    2
2    2
3    1
4    1
5    1
6    2
Name: Date Tested, dtype: int64

该实现存在明显缺陷:

  • 索引仅保留月份数字,丢失年份信息,跨年度统计时会合并不同年份的同月份数据
  • 若数据集起始月份不是1月,数字索引和实际月份无法对应
  • 拓展到按周、季度等维度统计时,纯数字索引完全无法识别对应时间周期

预期输出需要以年-月作为索引,直观匹配时间周期与对应计数值,格式如下:

2022-01   2
2022-02   2
2022-03   1
2022-04   1
2022-05   1
2022-06   2
Name: Date Tested, dtype: int64

实现方案

不需要修改value_counts()的内置逻辑,只需要在计数前把日期值归一化到对应统计周期的标识,再执行计数即可。

按月统计代码

# 统一转换日期格式
data['Date Tested'] = pd.to_datetime(data['Date Tested'], format = "%Y/%m/%d")
# 将日期转换为年月周期,计数后按索引排序保证时间顺序
month_counts = data['Date Tested'].dt.to_period('M').value_counts().sort_index()
print(month_counts)

运行后即可得到符合预期的统计结果。

拓展用法

  • 按周统计:将dt.to_period('M')替换为dt.to_period('W'),索引会自动生成带年份的周次标识,不会出现数字索引无法匹配周期的问题
  • 按季度/年度统计:对应传入参数'Q'/'Y'即可
  • 若需要字符串格式的年月索引,可将dt.to_period('M')替换为dt.strftime('%Y-%m'),输出效果一致

注意:value_counts()默认按计数值降序排列,统计时间序列时必须追加.sort_index(),否则会打乱时间先后顺序


内容的提问来源于stack exchange,提问作者Deez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 00:15:31