首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >pandas评分系统;平局显示为"3-4“

pandas评分系统;平局显示为"3-4“
EN

Stack Overflow用户
提问于 2021-09-02 22:09:42
回答 1查看 41关注 0票数 2

我在最后有一个基本的体育得分和球员排名我想做的是,如果他们的得分相等,而不是一个球员是3,另一个是4,我需要他们都是3-4,谁有什么好的提示,我可以找到解决方案?

代码语言:javascript
运行
复制
            Name  100 m  Long jump  Shot put  High jump  400 m  110 m hurdles  Discus throw  Pole vault  Javelin throw           1500 m  Total Score  Ranking
1    Edan Daniele  12.61       5.00      9.22       1.50  60.39          16.43         21.60         2.6          35.81  00:05:25.720000       3847.0        1
2      Coos Kwesi  13.75       4.84     10.12       1.50  68.44          19.18         30.85         2.8          33.88  00:06:22.750000       3127.0        2
3  Severi Eileifr  13.43       4.35      8.64       1.50  66.06          19.05         24.89         2.2          33.48  00:06:51.010000       2953.0        3
4     Lehi Poghos  13.04       4.53      7.79       1.55  64.72          18.74         24.20         2.4          28.20  00:06:50.760000       2940.0        4

这是结果,这是代码

代码语言:javascript
运行
复制
import numpy as np
from os import sep
import pandas as pd
df  =   pd.read_csv("Decathlon.csv",sep=";",header=None)
df.reset_index(drop=False)
df.index = np.arange(1, len(df) + 1)
df.columns  =   ["Name","100 m","Long jump","Shot put","High jump","400 m","110 m hurdles","Discus throw","Pole vault","Javelin throw","1500 m"]

df['100m score'] =  round(25.4347*((18-df["100 m"])**1.81))
df["Long jump score"]   =   round(0.14354*(((df["Long jump"]-220)*-1)**1.4))
df["shot put score"]    =  round( 51.39*((df["Shot put"]-1.5)**1.05))
df["high jump score"]   =  round( 0.8465*(((df["High jump"]-75)*-1)**1.42))
df["400m score"]    =  round( 1.53775*((82-df["400 m"])**1.81))
df['110m hurdles score']  =  round( 5.74352*((28.5-df['110 m hurdles'])**1.92))
df['Discus throw score']  =  round( 12.91*((df['Discus throw']-4)**1.1))
df['Pole vault score']  = round(  0.2797*(((df['Pole vault']-100)*-1)*1.35))
df['Javelin throw score'] =  round( 10.14*(((df['Javelin throw']-7)**1.08)))
df['1500 m'] =  pd.to_datetime(df['1500 m'].str.strip(), format='%M.%S.%f')
df['Minute'] = pd.to_datetime(df['1500 m']).dt.minute
df['sekunde'] = pd.to_datetime(df['1500 m']).dt.second
df['milisekunde'] = pd.to_datetime(df['1500 m']).dt.microsecond
df.loc[df['milisekunde']>500000,['sekunde']]   =   df['sekunde']+1
df['Total seconds'] =   (df["Minute"]*60)   +   df["sekunde"]
df['1500 m score']  =   round(0.03768*((480-df["Total seconds"])**1.85))
df["Total Score"]   =   df['100m score']+df["Long jump score"]+df["shot put score"]+df["high jump score"]+df["400m score"]+df['110m hurdles score']+df['Discus throw score']+df['Pole vault score']+df['Javelin throw score']+df['1500 m score']
df["1500 m"]    =   pd.DatetimeIndex(df['1500 m']).time

#clean up
del df['100m score']
del df["Long jump score"] 
del df["shot put score"] 
del df["high jump score"]
del df["400m score"]
del df['110m hurdles score']
del df['Discus throw score']
del df['Pole vault score']
del df['Javelin throw score']
del df['Minute']
del df['sekunde']
del df['milisekunde']
del df["Total seconds"]
del df ["1500 m score"]
df = df.sort_values(['Total Score'], ascending  =   False)
df= df.reset_index(drop =   True)
df.index = np.arange(1, len(df) + 1)
df["Ranking"]   =   df.index
print(df)
df.to_json('Json file')
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-02 23:21:10

假设"Decathlon.csv“文件如下所示:

代码语言:javascript
运行
复制
Edan Daniele;12.61;5.00;9.22;1.50;60.39;16.43;21.60;2.6;35.81;00:05:25.720000
Coos Kwesi;13.75;4.84;10.12;1.50;68.44;19.18;30.85;2.8;33.88;00:06:22.750000
Severi Eileifr;13.43;4.35;8.64;1.50;66.06;19.05;24.89;2.2;33.48;00:06:51.010000
Severi Eileifr;13.43;4.35;8.64;1.50;66.06;19.05;24.89;2.2;33.48;00:06:51.010000
Lehi Poghos;13.04;4.53;7.79;1.55;64.72;18.74;24.20;2.4;28.20;00:06:50.760000

下面是如何生成排名的方法:

代码语言:javascript
运行
复制
df["Ranking"] = df["Total Score"].apply(lambda score: df.index[df["Total Score"] == score].astype(str)).str.join("-")

输出:

代码语言:javascript
运行
复制
             Name  100 m  ...  Total Score  Ranking
1    Edan Daniele  12.61  ...       6529.0        1
2      Coos Kwesi  13.75  ...       6088.0        2
3  Severi Eileifr  13.43  ...       5652.0      3-4
4  Severi Eileifr  13.43  ...       5652.0      3-4
5     Lehi Poghos  13.04  ...       5639.0        5

或者只需使用.tolist()将排名作为列表:

代码语言:javascript
运行
复制
df["Ranking"] = df["Total Score"].apply(lambda score: df.index[df["Total Score"] == score].tolist())
代码语言:javascript
运行
复制
             Name  100 m  ...  Total Score  Ranking
1    Edan Daniele  12.61  ...       6529.0      [1]
2      Coos Kwesi  13.75  ...       6088.0      [2]
3  Severi Eileifr  13.43  ...       5652.0   [3, 4]
4  Severi Eileifr  13.43  ...       5652.0   [3, 4]
5     Lehi Poghos  13.04  ...       5639.0      [5]

不过,这可能不是最好的方法

注意:为了与您提供的示例相匹配,我在初始csv中设置了相同的第3行和第4行

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69037527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档