Pandas中按Area Team Name单独汇总6个月数据的异常问题排查
问题分析与解决方案
你现在遇到的核心问题是透视表没有按Area Team Name分组,反而聚合了全量数据,根源出在两个细节上:
- 只把
Month设为了透视表的索引,没将Area Team Name纳入分组维度,导致所有团队的数据被合并计算 - 错误地把
Area Team Name放到了values参数里——这个列是分类文本,用np.sum聚合完全没有意义,它应该是你的分组依据
修正后的透视表代码
如果想要先按团队分组、再按月份展示成本总和,把Area Team Name和Month一起设为索引即可:
import pandas as pd import numpy as np pivoted_df = pd.pivot_table( sample(), index=["Area Team Name", "Month"], # 同时按团队和月份分组 values=["Actual Cost"], # 只聚合数值型的成本列 aggfunc=np.sum ) print(pivoted_df)
输出会是层级化的结果,清晰展示每个团队每月的成本总和:
Actual Cost Area Team Name Month Team Alpha JULY 123456.78 AUGUST 234567.89 Team Beta JULY 345678.90 AUGUST 456789.01
如果你希望把每个团队作为单独列、横向对比每月成本,可以把Area Team Name放到columns参数里:
pivoted_df = pd.pivot_table( sample(), index="Month", columns="Area Team Name", values=["Actual Cost"], aggfunc=np.sum, fill_value=0 # 可选:把无数据的单元格填充为0 ) print(pivoted_df)
额外:为每个团队单独构建线性回归
如果要基于分组数据为每个团队训练线性回归模型,用groupby会更直接(先把月份转换成数值,因为模型需要数值特征):
from sklearn.linear_model import LinearRegression # 先处理数据:把月份映射为连续数值 df = sample().copy() month_mapping = {'JULY':1, 'AUGUST':2, 'SEPTEMBER':3, 'OCTOBER':4, 'NOVEMBER':5, 'DECEMBER':6} df['Month_Num'] = df['Month'].map(month_mapping) # 按团队分组,逐个训练模型 team_models = {} for team_name, team_data in df.groupby('Area Team Name'): X = team_data[['Month_Num']] y = team_data['Actual Cost'] model = LinearRegression() model.fit(X, y) team_models[team_name] = model # 示例:查看某个团队的模型参数 # print(team_models['Team Alpha'].coef_, team_models['Team Alpha'].intercept_)
内容的提问来源于stack exchange,提问作者Lavinia Martin
相关产品推荐
相关产品推荐

