我有以下的运动员参加比赛的数据。
pos country year round event athlete Battle
1 Jamaica 2012 100m Beijing BOLT 0
2 Jamaica 2012 100m Beijing BLAKE 0
4 USA 2012 100m Beijing GAY 0
3 USA 2012 100m Beijing JOHN 0
6 Jamaica 2012 200m Beijing BOLT 0
7 Jamaica 2012 200m Beijing BLAKE 0
3 USA 2012 200m Beijing GAY 0
4 USA 2012 200m Beijing JOHN 0我想给‘战斗’列赋值,它表示运动员获得了更高的网格位置。就像这样:
pos country year round event athlete Battle
1 Jamaica 2012 100m Beijing BOLT 1
2 Jamaica 2012 100m Beijing BLAKE 0
4 USA 2012 100m Beijing GAY 0
3 USA 2012 100m Beijing JOHN 1
6 Jamaica 2012 200m Beijing BOLT 2
7 Jamaica 2012 200m Beijing BLAKE 0
3 USA 2012 200m Beijing GAY 1
4 USA 2012 200m Beijing JOHN 1博尔特在两场比赛中都比布莱克有更好的位置,所以他在两轮比赛后的battle值将是2,而布雷克的0。盖伊和约翰在其中一场比赛中表现得更好,所以他们的数值是1和1。
如何计算大熊猫中的Battle列?我不知道从哪里开始。我看过其他问题,包括我自己的Assigning value to pandas dataframe values for unique values in another column和Compare values in two different pandas columns,但是这些比较和/或操作跨越了两列,而我想要的结果迫使我考虑多列(year, round, event, country)必须是常见的,并在athlete列中找到唯一的值并进行比较。
我试着用country来隔离运动员,使用df.groupby(['country', 'round', 'pos']).apply(lambda x: x['athlete'])
country round pos athlete
Jamaica 100m 1 BOLT
2 BLAKE
USA 100m 4 GAY
3 JOHN
Jamaica 200m 6 BOLT
7 BLAKE
USA 200m 3 GAY
4 JOHN 虽然这隔离了重要的信息,但我仍然困惑于如何比较他们的立场。
发布于 2021-10-28 13:29:31
IIUC,你可以:
groupby国家和地区,并对运动员进行排名,看看他们outperformed.groupby运动员还有多少人,并把他们的排名相加。--df["rank"] = df.groupby(["country", "round"])["pos"].transform(pd.Series.rank, ascending=False, method="dense")-1
df["Battle"] = df.groupby("athlete")["rank"].transform(sum)
>>> df.drop("rank", axis=1)
pos country year round event athlete Battle
0 1 Jamaica 2012 100m Beijing BOLT 2.0
1 2 Jamaica 2012 100m Beijing BLAKE 0.0
2 4 USA 2012 100m Beijing GAY 1.0
3 3 USA 2012 100m Beijing JOHN 1.0
4 6 Jamaica 2012 200m Beijing BOLT 2.0
5 7 Jamaica 2012 200m Beijing BLAKE 0.0
6 3 USA 2012 200m Beijing GAY 1.0
7 4 USA 2012 200m Beijing JOHN 1.0
~~~https://stackoverflow.com/questions/69754686
复制相似问题