Pandas实现:将列值统计结果转为DataFrame新列
问题描述
我有如下结构的Pandas DataFrame:
| Type | Status |
|---|---|
| typeA | New |
| typeA | Working |
| typeA | Working |
| typeA | Closed |
| typeA | Closed |
| typeA | Closed |
| typeB | New |
| typeB | Working |
| typeC | Closed |
| typeC | Closed |
| typeC | Closed |
需要按Type字段分组,将各Status的计数转为新列,得到如下结果:
| Type | New | Working | Closed |
|---|---|---|---|
| typeA | 1 | 2 | 3 |
| typeB | 1 | 1 | 0 |
| typeC | 0 | 0 | 3 |
同时,要求包含所有可能的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
相关产品推荐
相关产品推荐

