繁体   English   中英

Dataframe 使用 groupby 计算

[英]Dataframe calculation using groupby

我正在尝试使用 dataframe group by 计算列的平均值,但结果不正确。 我大致知道它为什么会这样做,我只是不知道如何解决它。 我正在尝试获取球队对手的平均表现 - 现在,它计算正确,但将其放在错误的行中。 例如,绿湾对阵芝加哥和明尼苏达——他们的对手平均上场时间为 62.5 次。 芝加哥对阵绿湾和丹佛,后者平均上场 66.5 场。 因此,在我的示例中,芝加哥的每场对手数应为 66.5,而 GB 的对手数为 62.5。 不幸的是,它正在逆转这些。 我认为它是按防御分组,并将平均值写入第一行,在这种情况下实际上是他们的对手。 这有点难以解释,所以我附上图片来帮助展示正在发生的事情。

我也知道我可能会写一个 function 而不是现在的代码结构方式,这可能是我明天的任务,但目前这里是代码。

import pandas as pd
import os
import time
import numpy as np

beginningTime = time.time()

dfTeam = pd.read_csv("TEAM.csv")


dfSchedule = pd.read_csv("SCHEDULE.csv")

dfTandS = pd.merge(dfTeam, dfSchedule, on='gid', how='inner')

dfTandS['Defense'] = np.where(dfTandS.tname == dfTandS.v, dfTandS.h, dfTandS.v)

dfTandS.to_excel("Team and Schedule.xlsx", index=False)

dfTeamRankings = pd.read_excel("Team Rankings.xlsx")
dfTandS['Total Plays'] = dfTandS['ra'] + dfTandS['pa'] + dfTandS['sk']
dfTandS['Passing Plays'] = dfTandS['pa'] + dfTandS['sk']


dfTeamRankings['Plays Per Game'] = dfTandS.groupby('tname')['Total Plays'].transform('mean')
dfTeamRankings['Rank - Plays Per Game'] = dfTeamRankings['Plays Per Game'].rank(ascending=False, method='min')
这是它工作不正常的地方
dfTeamRankings['Opponent Plays Per Game'] = dfTandS.groupby('Defense')['Total Plays'].transform('mean') dfTeamRankings['Rank - Opponent Plays Per Game'] = dfTeamRankings['Opponent Plays Per Game'].rank(ascending=False, method='min') dfTeamRankings['Passing Plays Per Game'] = dfTandS.groupby('tname')['Passing Plays'].transform('mean') dfTeamRankings['Rank - Passing Plays Per Game'] = dfTeamRankings['Passing Plays Per Game'].rank(ascending=False, method='min') dfTeamRankings['Rushing Plays Per Game'] = dfTandS.groupby('tname')['ra'].transform('mean') dfTeamRankings['Rank - Rushing Plays Per Game'] = dfTeamRankings['Rushing Plays Per Game'].rank(ascending=False, method='min') dfTeamRankings.to_excel('Team Rankings.xlsx', index=False)

初始数据的结构

不正确的输出,因为数字在两队之间翻转

如果没有数据,很难弄清楚什么最有效,但这可能会有所帮助:

dfTeamRankings['Opponent Plays Per Game'] = dfTandS.groupby('Defense').agg(np.mean)['Total Plays']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM