如何对DataFrame按年月分组并统计各Severity值的数量?
按年月分组统计各Severity的数量
问题分析
需要按年月分组统计不同Severity值的出现次数,同时解决原始数据中Severity大小写不一致的问题,并确保结果包含所有预期的Severity类型(即使对应数量为0)。
解决方案
通过以下步骤实现需求:
- 统一
Severity的大小写格式,避免因大小写差异导致分组错误; - 从原始
date列提取年月信息作为分组依据; - 用透视表完成分组统计,填充缺失值为0,并补全所有预期的
Severity列。
完整代码示例
import pandas as pd # 创建示例DataFrame data = { 'date': ['01-12-22', '05-12-22', '22-12-22', '01-01-23', '21-01-23', '30-01-23'], 'Severity': ['Sev1', 'Sev5', 'Sev1', 'Sev4', 'sev4', 'sev3'] } df = pd.DataFrame(data) # 统一Severity大小写(转为首字母大写) df['Severity'] = df['Severity'].str.capitalize() # 提取年月部分(格式为MM-YY) df['year_month'] = df['date'].str.split('-').apply(lambda x: f"{x[1]}-{x[2]}") # 生成透视表统计数量,缺失值填0 result = pd.pivot_table( df, index='year_month', columns='Severity', aggfunc='size', fill_value=0 ).reset_index().rename(columns={'year_month': 'date'}) # 补全所有预期的Severity列(Sev1-Sev5) expected_severities = ['Sev1', 'Sev2', 'Sev3', 'Sev4', 'Sev5'] for sev in expected_severities: if sev not in result.columns: result[sev] = 0 # 调整列顺序与预期结果匹配 result = result[['date'] + expected_severities] # 输出结果 print(result)
输出结果
date Sev1 Sev2 Sev3 Sev4 Sev5 0 01-23 0 0 1 2 0 1 12-22 2 0 0 0 1
关键步骤说明
- 统一大小写:用
str.capitalize()将Severity值转为首字母大写,解决Sev4和sev4被误判为不同类别的问题; - 提取年月:拆分
date字符串,提取月份和年份生成MM-YY格式的分组键; - 透视表统计:
pivot_table自动按分组键和Severity聚合计数,fill_value=0确保无数据的类别显示为0; - 补全列:遍历预期
Severity列表,为结果添加缺失列并赋值0,保证输出结构符合需求。
内容的提问来源于stack exchange,提问作者welu
相关产品推荐
相关产品推荐

