找不到最大索引行的列值

时间:2019-06-12 13:07:51

标签: python pandas dataframe indexing

在Py Coursera课程中流行的UM DS简介中,我很难完成第2周作业中的第二个问题。基于以下df示例:

      # Summer  Silver  Bronze  Total  ...  Silver.2  Bronze.2  Combined total   ID
Gold                                   ...
0           13       0       2      2  ...         0         2               2  AFG
5           12       2       8     15  ...         2         8              15  ALG
18          23      24      28     70  ...        24        28              70  ARG
1            5       2       9     12  ...         2         9              12  ARM
3            2       4       5     12  ...         4         5              12  ANZ

[5 rows x 15 columns]

问题如下:

  

问题1

     

哪个国家/地区的夏季奥运会获得了最多的金牌?

     

此函数应返回单个字符串值。

     

答案是“美国”

我知道这很初级,但是我无法理解。非常尴尬,但非常沮丧。

以下是我遇到的错误。

df['Gold'].argmax()
...
KeyError: 'Gold'

df['Gold'].idxmax()
...
KeyError: 'Gold'

max(df.idxmax())
...
TypeError: reduction operation 'argmax' not allowed for this dtype

df.ID.idxmax()
TypeError: reduction operation 'argmax' not allowed for this dtype

这有效,但不适用于功能

df['ID'].sort_index(axis=0,ascending=False).iloc[0]

我非常感谢您的支持。

更新1 One successful attempt 感谢@Grr!我仍然对其他方法为何失败感到好奇

更新2 Second successful attempt感谢@alec_djinn,这种方法类似于我以前尝试过但无法弄清楚的方法。谢谢!

3 个答案:

答案 0 :(得分:0)

像这样尝试:

df.ID.idxmax()

答案 1 :(得分:0)

该列是您的索引有点奇怪,但是因为这样您可能会抓住索引值等于索引最大值的行,然后引用ID列。

df[df.index == df.index.max()].ID

您的其他方法由于KeyError而失败。索引名称为Gold,但是Gold不在列索引中,因此会引发KeyError。即如果以“ Gold”作为索引,则无法使用df['Gold']。而是使用df.index。您也可以像这样重置索引。

df = df.reset_index()
df

   Gold  # Summer  Silver  Bronze  Total  # Winter  Gold.1  ...  Total.1  # Games  Gold.2  Silver.2  Bronze.2  Combined total   ID
0     0        13       0       2      2         0       0  ...        0       13       0         0         2               2  AFG
1     5        12       2       8     15         3       0  ...        0       15       5         2         8              15  ALG
2    18        23      24      28     70        18       0  ...        0       41      18        24        28              70  ARG
3     1         5       2       9     12         6       0  ...        0       11       1         2         9              12  ARM
4     3         2       4       5     12         0       0  ...        0        2       3         4         5              12  ANZ

[5 rows x 16 columns]

然后,您可以像以前一样使用df['Gold']df.Gold,因为现在可以接受“金”键。

df.Gold.idxmax()
2

在我的情况下,它是18枚金牌的“ ARG”

答案 2 :(得分:0)

我认为您想执行以下操作:

df.sort_index(ascending=False, inplace=True)
df.head(1)['ID'] #or df.iloc[0]['ID']

在函数中应该是:

def f(df):
    df.sort_index(ascending=False, inplace=True) #you can sort outside the function as well
    return df.iloc[0]['ID']