Python Pandas按多列分组计算球队分区胜率均值报错求助
解决方案:计算同分区其他球队的W-L%均值
问题背景
现有包含2000-2022年NFL球队数据的DataFrame,结构如下:
Tm Conference Division W-L%. Year Bills AFC East 0.813 2022 Dolphins AFC East 0.529 2022 Patriots AFC East 0.471 2022 Jets AFC East 0.412 2022 Cowboys NFC East 0.706 2022 Giants NFC East 0.559 2022 Eagles NFC East 0.824 2022 Commanders NFC East 0.500 2022
需要新增Division W-L%列,计算当前球队同分区、同联盟、同年份的其他所有球队W-L%均值,公式为:(同分组W-L%总和 - 当前球队W-L%) / (分组球队数 - 1)
核心问题分析
你之前报错的原因是分组维度错误:不应该将Tm(球队)纳入分组键,否则每个分组仅包含单支球队的数据,会触发除以零错误,且无法获取同分区其他球队的统计值。正确的分组维度应为Conference、Division、Year。
实现代码
方法1:分步计算(清晰直观)
# 计算每个分区-联盟-年份组的W-L%总和 df['div_total'] = df.groupby(['Conference', 'Division', 'Year'])['W-L%'].transform('sum') # 计算每个分组的球队数量 df['div_team_count'] = df.groupby(['Conference', 'Division', 'Year'])['Tm'].transform('count') # 套用公式计算目标列 df['Division W-L%'] = (df['div_total'] - df['W-L%']) / (df['div_team_count'] - 1) # 可选:删除中间辅助列 df = df.drop(['div_total', 'div_team_count'], axis=1)
方法2:简洁版(一行transform)
df['Division W-L%'] = df.groupby(['Conference', 'Division', 'Year'])['W-L%'].transform( lambda x: (x.sum() - x) / (len(x) - 1) )
结果验证
执行后将得到符合预期的DataFrame:
Tm Conference Division W-L%. Year Division W-L% Bills AFC East 0.813 2022 0.470667 Dolphins AFC East 0.529 2022 0.565333 Patriots AFC East 0.471 2022 0.584667 Jets AFC East 0.412 2022 0.604333 Cowboys NFC East 0.706 2022 0.627667 Giants NFC East 0.559 2022 0.676667 Eagles NFC East 0.824 2022 0.588333 Commanders NFC East 0.500 2022 0.696333
内容的提问来源于stack exchange,提问作者bobfreedy00
相关产品推荐
相关产品推荐

