如何找到某人在 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
因此,如数据框中所示,有 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