python-3.x - 使用 nlargest 找到比赛的获胜者
问题描述
我在熊猫中遇到了 nlargest 的问题。我似乎无法弄清楚为什么每个名称的列没有正确排序。即使第二列或第三列的分数较高,nlargest 似乎也只适用于第一列。我试图根据谁拥有最高的两个分数来找到获胜者。在下面的示例中,Jeff 应该是获胜者,但 nlargest 仅适用于第一列,因此 dan 总是获胜。任何帮助将不胜感激。
示例代码:
import pandas as pd
names = []
con = int(input("Number of Contestants: "))
maxSurfers = con #number of surfers
while len(names) < maxSurfers:
name = input(" Enter your Name: ")
names.append(name)
print("Contestants")
print(names)
else:
print("Thank You for Participating!\n")
print("Sign up is now closed\n")
score = {}
for name in names:
numWaves = int(input("Number of Waves for "+name+": "))
newScores = []
for i in range(numWaves):
newScores.append(float(input("Enter score wave: ")))
score[name] = newScores
#newScores - most recent entry committed to score directory
df = pd.DataFrame(score)
for (columnName, columnData) in df.iteritems():
winner = df.nlargest(2, names)
print(winner)
输出:
Number of Contestants: 3
Enter your Name: dan
Contestants
['dan']
Enter your Name: jeff
Contestants
['dan', 'jeff']
Enter your Name: eric
Contestants
['dan', 'jeff', 'eric']
Thank You for Participating!
Sign up is now closed
Number of Waves for dan: 5
Enter score wave: 3.0
Enter score wave: 10.0
Enter score wave: 5.6
Enter score wave: 9.5
Enter score wave: 3.0
Number of Waves for jeff: 5
Enter score wave: 10.0
Enter score wave: 3.0
Enter score wave: 3.0
Enter score wave: 9.9
Enter score wave: 3.0
Number of Waves for eric: 5
Enter score wave: 3.0
Enter score wave: 1.0
Enter score wave: 5.6
Enter score wave: 9.5
Enter score wave: 6.3
dan jeff eric
1 10.0 3.0 1.0
3 9.5 9.9 9.5
期望的输出:
Number of Contestants: 3
Enter your Name: dan
Contestants
['dan']
Enter your Name: jeff
Contestants
['dan', 'jeff']
Enter your Name: eric
Contestants
['dan', 'jeff', 'eric']
Thank You for Participating!
Sign up is now closed
Number of Waves for dan: 5
Enter score wave: 3.0
Enter score wave: 10.0
Enter score wave: 5.6
Enter score wave: 9.5
Enter score wave: 3.0
Number of Waves for jeff: 5
Enter score wave: 10.0
Enter score wave: 3.0
Enter score wave: 3.0
Enter score wave: 9.9
Enter score wave: 3.0
Number of Waves for eric: 5
Enter score wave: 3.0
Enter score wave: 1.0
Enter score wave: 5.6
Enter score wave: 9.5
Enter score wave: 6.3
dan jeff eric
0 3.0 10.0 3.0
3 9.5 9.9 9.5
解决方案
问题在于,df.nlargest
对于列列表(对于参数columns
),将首先根据列表中的第一个值(dan)排序,然后是第二个值(jeff),最后是 eric。
它在文档页面的末尾进行了解释nlargest
:
要获得每列的最高两个值,请尝试以下方式:
df = pd.DataFrame(score)
winner_df = pd.DataFrame()
for (columnName, columnData) in df.iteritems():
winner = df.nlargest(2, columnName)[columnName].reset_index(drop= True)
winner_df[columnName] = winner
print(winner_df)
输出:
dan jeff eric
0 10.0 10.0 9.5
1 9.5 9.9 6.3
推荐阅读
- python - 过滤图类型
- blockchain - 实现子图来查询不同的区块链
- next.js - 使用 FaunaDB Dev 获取会话错误的 Next-Auth
- python - Matplotlib Plot 的标题和副标题不对齐
- java - 按对列表中的出现映射对象
- terraform - 使用“随机”资源(整数/字符串)时如何在 Terraform 中动态生成新变量?
- freemarker - Freemarker 函数字符串格式化
- mysql - 使用 concat 将一个简单的字符串、一个子查询和另一个简单的字符串放在一起
- java - 如何在java中使用正则表达式从url获取可选参数的值
- ruby - 错误:新模式破坏了与 rails 和 graphql 的向后兼容性