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

如何对DataFrame按年月分组并统计各Severity值的数量?

按年月分组统计各Severity的数量

问题分析

需要按年月分组统计不同Severity值的出现次数,同时解决原始数据中Severity大小写不一致的问题,并确保结果包含所有预期的Severity类型(即使对应数量为0)。

解决方案

通过以下步骤实现需求:

  1. 统一Severity的大小写格式,避免因大小写差异导致分组错误;
  2. 从原始date列提取年月信息作为分组依据;
  3. 用透视表完成分组统计,填充缺失值为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 21:30:49