我有一个DataFrame,其中包含自1985年以来每场March Madness游戏的信息。现在,我试图逐轮计算较高种子的获胜百分比。主要的DataFrame如下所示:
我认为最好的方法是创建单独的函数。第一个处理当分数高于score.1返回团队时以及分数.1高于返回团队1时,然后在函数末尾附加这些。下一个需要满足的条件:您将seed.1高于种子并返回团队,然后将种子高于seed.1和返回团队。1然后追加和最后一个函数在它们相等时创建一个函数
def func1(x):
if tourney.loc[tourney['Score']] > tourney.loc[tourney['Score.1']]:
return tourney.loc[tourney['Team']]
elif tourney.loc[tourney['Score.1']] > tourney.loc[tourney['Score']]:
return tourney.loc[tourney['Team.1']]
func1(tourney.loc[tourney['Score']])
答案 0 :(得分:0)
您可以使用axis=1
将lambda函数应用于整个数据帧,从而应用逐行函数。这将使您获得True/False
列'low_seed_wins'
。
使用新的True / False列,您可以获取计数和总和(count是游戏数,sum是Lower_seed胜利数)。使用此功能,您可以将总和除以计数以获得胜率。
这仅起作用,因为您的低级种子团队始终在左侧。如果不是这样,将会更加复杂。
import pandas as pd
df = pd.DataFrame([[1987,3,1,74,68,5],[1987,3,2,87,81,6],[1987,4,1,84,81,2],[1987,4,1,75,79,2]], columns=['Year','Round','Seed','Score','Score.1','Seed.1'])
df['low_seed_wins'] = df.apply(lambda row: row['Score'] > row['Score.1'], axis=1)
df = df.groupby(['Year','Round'])['low_seed_wins'].agg(['count','sum']).reset_index()
df['ratio'] = df['sum'] / df['count']
df.head()
Year Round count sum ratio
0 1987 3 2 2.0 1.0
1 1987 4 2 1.0 0.5
答案 1 :(得分:0)
您应该通过检查第一队和第二队的两个条件来计算。这将返回一个布尔值,该布尔值的总和为真实的案例数。然后,将其除以整个数据帧的长度即可得出百分比。没有测试数据很难准确检查
(
((tourney['Seed'] > tourney['Seed.1']) &
(tourney['Score'] > tourney['Score.1'])) ||
((tourney['Seed.1'] > tourney['Seed']) &
(tourney['Score.1'] > tourney['Score']))
).sum() / len(tourney)