2 回答
TA贡献1824条经验 获得超8个赞
您可以通过将 lambda 函数应用于整个数据帧来应用逐行函数,使用axis=1. 这将允许您获得一个True/False列'low_seed_wins'。
使用新的 True/False 列,您可以获取计数和总和(计数是游戏数,总和是 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
TA贡献1801条经验 获得超8个赞
您应该通过检查第一队和第二队的两个条件来计算这一点。这将返回一个布尔值,其总和是它为真的情况数。然后只需除以整个数据帧的长度即可得到百分比。没有测试数据很难准确检查
(
((tourney['Seed'] > tourney['Seed.1']) &
(tourney['Score'] > tourney['Score.1'])) ||
((tourney['Seed.1'] > tourney['Seed']) &
(tourney['Score.1'] > tourney['Score']))
).sum() / len(tourney)
添加回答
举报
