如何用Python Pandas Groupby多列分组并统计状态次数
Pandas分组统计Late/On Time次数解决方案
你可以通过分组聚合一次性搞定总次数、Late次数和On Time次数,不用分开计算。这里给你三种简洁的实现方式:
方法一:分组+聚合条件计数(最直接)
直接在groupby的agg方法里同时统计总次数、符合条件的Late和On Time次数:
import pandas as pd import numpy as np # 基于你的原始df1计算 df_result = df1.groupby(['Type', 'Product']).agg( **{ 'Product/Type Count': ('Late or On Time', 'size'), 'Late Count': ('Late or On Time', lambda x: np.sum(x == 'Late')), 'On Time Count': ('Late or On Time', lambda x: np.sum(x == 'On Time')) } ).reset_index()
方法二:交叉表+合并统计
先用pd.crosstab生成组合对应的Late/On Time频次,再计算总次数并调整格式:
# 生成Type/Product与Late/On Time的交叉频次表 counts = pd.crosstab([df1['Type'], df1['Product']], df1['Late or On Time']).reset_index() # 计算总次数 counts['Product/Type Count'] = counts['Late'] + counts['On Time'] # 调整列名和顺序匹配需求 counts = counts[['Type', 'Product', 'Product/Type Count', 'Late', 'On Time']].rename( columns={'Late': 'Late Count', 'On Time': 'On Time Count'} )
方法三:哑变量转换+分组求和
把状态列转成哑变量后分组求和,再补充总次数:
# 把"Late or On Time"转成哑变量列 dummies = pd.get_dummies(df1['Late or On Time']) # 合并Type、Product和哑变量列 combined = pd.concat([df1[['Type', 'Product']], dummies], axis=1) # 分组求和 df_result = combined.groupby(['Type', 'Product']).sum().reset_index() # 计算总次数 df_result['Product/Type Count'] = df_result['Late'] + df_result['On Time'] # 调整列名和顺序 df_result = df_result.rename(columns={'Late': 'Late Count', 'On Time': 'On Time Count'}) df_result = df_result[['Type', 'Product', 'Product/Type Count', 'Late Count', 'On Time Count']]
三种方法都能得到你想要的输出,其中方法一最省心,一次分组就完成所有统计。
内容的提问来源于stack exchange,提问作者hobbsac
相关产品推荐
相关产品推荐

