如何找到某人在 Python Pandas 之前赢得比赛的平均时间

How to find the average amount of time somebody won a race by Python Pandas

因此,如数据框中所示,有 3 场比赛。我想找出每场比赛的第一名和第二名之间的时间差,然后输出将是每个跑步者赢得每场比赛的平均值。

import pandas as pd

# initialise data of lists.
data = {'Name':['A', 'B', 'B', 'C', 'A', 'C'], 'RaceNumber': 
[1, 1, 2, 2, 3, 3], 'PlaceWon':['First', 'Second', 'First', 'Second', 'First', 'Second'], 'TimeRanInSec':[100, 98, 66, 60, 75, 70]}

# Create DataFrame
df = pd.DataFrame(data)

# Print the output.
print(df)

在这种情况下,输出将是一个数据框,输出 A 赢得比赛的平均时间为 3.5 秒。 B 平均领先 6 秒

我想这可以通过按 RaceNumber 分组然后减去 TimeRanInSec 来完成。但不确定如何获得每个名称的平均值。

我认为你需要两次 groupby 操作,一次获取每场比赛的获胜利润率,然后一次获取每个人的平均获胜利润率。

对于通用解决方案,我会首先定义一个函数,用于根据时间列表(对于一场比赛)计算获胜利润。然后,您可以将该函数应用于每个比赛组的时间,并将所得的获胜利润加入所有获胜者的数据框中。然后很容易得到想要的平均值:

def winning_margin(times):
    times = list(times)
    winner = min(times)
    times.remove(winner)
    return min(times) - winner

winning_margins = df[['RaceNumber', 'TimeRanInSec']] \
                    .groupby('RaceNumber').agg(winning_margin)
winning_margins.columns = ['margin']

winners = df.loc[df.PlaceWon == 'First', :]
winners = winners.join(winning_margins, on='RaceNumber')

avg_margins = winners[['Name', 'margin']].groupby('Name').mean()
avg_margins
      margin
Name    
A     3.5
B     6.0