如何让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
相关产品推荐
相关产品推荐

