如何按Workers和Week分组统计ITCD与Indicateur RDV的OK/NOK数量
解决方案
完整代码实现
使用Pandas可以通过长格式转换+交叉统计的方式实现需求,以下是可直接运行的代码:
import pandas as pd # 1. 构建样本数据表 data = { '_ITCD_': ['OK', 'OK', 'NOK'], '_Indicateur RDV_': ['OK', 'NOK', 'NOK'], 'Week': [41, 41, 40], 'Workers': ['John', 'John', 'Liam'] } df = pd.DataFrame(data) # 2. 将宽表转换为长格式,统一处理统计列 melted_df = df.melt( id_vars=['Workers', 'Week'], value_vars=['_ITCD_', '_Indicateur RDV_'], var_name='统计类别', value_name='状态' ) # 3. 按Workers、Week、统计类别、状态交叉计数 count_result = pd.crosstab( index=[melted_df['Workers'], melted_df['Week']], columns=[melted_df['统计类别'], melted_df['状态']], margins=False ).reset_index().fillna(0).astype(int) # 4. 调整表头层次结构,匹配期望输出格式 count_result.columns = pd.MultiIndex.from_tuples([ ('Workers', ''), ('Week', ''), ('_ITCD_', 'OK'), ('_ITCD_', 'NOK'), ('_Indicateur RDV_', 'OK'), ('_Indicateur RDV_', 'NOK') ]) # 5. 打印结果 print(count_result.to_string(index=False))
输出结果
运行后会得到与你期望一致的格式:
Workers Week _ITCD_ _Indicateur RDV_ OK NOK OK NOK John 41 2 0 1 1 Liam 40 0 1 0 1
关键步骤说明
- melt转换:把
_ITCD_和_Indicateur RDV_两个统计列转为统一的"统计类别"列,让后续统计逻辑更简洁。 - crosstab计数:自动按分组维度(Workers、Week、类别、状态)完成计数,
fillna(0)确保缺失的组合(比如John的_ITCD_ NOK)显示为0而非NaN。 - 表头层次调整:通过
MultiIndex构建双层表头,完美匹配你需要的输出样式。
内容的提问来源于stack exchange,提问作者Walid Ar
相关产品推荐
相关产品推荐

