首页 > 解决方案 > 使用 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

标签: python-3.xpandasdataframe

解决方案


问题在于,df.nlargest对于列列表(对于参数columns),将首先根据列表中的第一个值(dan)排序,然后是第二个值(jeff),最后是 eric。

它在文档页面的末尾进行了解释nlargest

pandas.DataFrame.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

推荐阅读