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

Pandas实现:将列值统计结果转为DataFrame新列

问题描述

我有如下结构的Pandas DataFrame:

TypeStatus
typeANew
typeAWorking
typeAWorking
typeAClosed
typeAClosed
typeAClosed
typeBNew
typeBWorking
typeCClosed
typeCClosed
typeCClosed

需要按Type字段分组,将各Status的计数转为新列,得到如下结果:

TypeNewWorkingClosed
typeA123
typeB110
typeC003

同时,要求包含所有可能的Status(我有完整的状态列表),即使原DataFrame中没有对应数据,最终结果需包含Escalate等缺失状态列并补0。

我尝试了以下代码,但均未得到预期结果:

closureCodeCounts = closureCodes.groupby(['type','status'],as_index=False).size()
closureCodeCounts = closureCodeCounts.groupby('type').value_counts()
closureCodeCounts = closureCodeCounts.unstack()

请问实现该需求的最优方法是什么?


解决方案

最优实现可以用**pd.crosstab**,它专门用于交叉频次统计,能直接生成你需要的宽表结构,还能强制包含指定的所有状态列,缺失值自动补0:

1. 先定义完整状态列表

假设你的全量状态列表如下:

all_statuses = ['New', 'Working', 'Closed', 'Escalate']

2. 用pd.crosstab生成结果

import pandas as pd

# 生成交叉统计表格,指定行、列维度,强制包含所有状态,缺失计数补0
result = pd.crosstab(closureCodes['Type'], closureCodes['Status'], columns=all_statuses, fill_value=0)

备选方案:pivot_table实现

如果更习惯用分组透视的方式,也可以用pivot_table:

result = closureCodes.pivot_table(
    index='Type',
    columns='Status',
    aggfunc='size',  # 统计每组的行数即频次
    fill_value=0,
    columns=all_statuses  # 强制指定所有需要的状态列
)

关键说明

  • pd.crosstab是处理这类交叉统计场景的最优工具,代码简洁且性能高效;
  • 通过columns=all_statuses参数,能确保所有需要的状态列都被保留,哪怕原数据中没有对应记录;
  • fill_value=0直接将缺失的计数填充为0,无需额外做空值处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:35:19