在 pandas DataFrame 中查找列值最大的行

新手上路,请多包涵

如何找到特定列的值 最大 的行?

df.max() 会给我每列的最大值,我不知道如何得到相应的行。

原文由 Miki Tebeka 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 696
2 个回答

使用熊猫 idxmax 功能。很简单:

 >>> import pandas
>>> import numpy as np
>>> df = pandas.DataFrame(np.random.randn(5,3),columns=['A','B','C'])
>>> df
          A         B         C
0  1.232853 -1.979459 -0.573626
1  0.140767  0.394940  1.068890
2  0.742023  1.343977 -0.579745
3  2.125299 -0.649328 -0.211692
4 -0.187253  1.908618 -1.862934
>>> df['A'].idxmax()
3
>>> df['B'].idxmax()
4
>>> df['C'].idxmax()
1

  • 或者,您也可以使用 numpy.argmax ,例如 numpy.argmax(df['A']) 它提供相同的东西,并且在粗略观察中至少与 idxmax 一样快–

  • idxmax() 返回索引标签,而不是整数。

  • 示例:如果您将字符串值作为索引标签,例如行“a”到“e”,您可能想知道最大值出现在第 4 行(而不是行“d”)。

  • 如果您想要该标签在 Index 中的整数位置,您必须手动获取它(现在允许重复的行标签,这可能很棘手)。


历史记录:

例如,考虑这个玩具 DataFrame 具有重复的行标签:

 In [19]: dfrm
Out[19]:
          A         B         C
a  0.143693  0.653810  0.586007
b  0.623582  0.312903  0.919076
c  0.165438  0.889809  0.000967
d  0.308245  0.787776  0.571195
e  0.870068  0.935626  0.606911
f  0.037602  0.855193  0.728495
g  0.605366  0.338105  0.696460
h  0.000000  0.090814  0.963927
i  0.688343  0.188468  0.352213
i  0.879000  0.105039  0.900260

In [20]: dfrm['A'].idxmax()
Out[20]: 'i'

In [21]: dfrm.iloc[dfrm['A'].idxmax()]  # .ix instead of .iloc in older versions of pandas
Out[21]:
          A         B         C
i  0.688343  0.188468  0.352213
i  0.879000  0.105039  0.900260

因此,这里单纯使用 idxmax 是不够的,而旧形式的 argmax 将正确提供最大行的 _位置_(在本例中为位置 9)。

这正是动态类型语言中那些令人讨厌的容易出错的行为之一,这使得这种事情非常不幸,值得一试。如果您正在编写系统代码并且您的系统突然被用于一些在加入之前没有正确清理的数据集,那么很容易以重复的行标签结束,尤其是像金融资产的 CUSIP 或 SEDOL 标识符这样的字符串标签。您无法轻松地使用类型系统来帮助您解决问题,并且您可能无法在不遇到意外丢失数据的情况下强制索引的唯一性。

因此,您只能希望您的单元测试涵盖了所有内容(它们没有,或者更可能没有人编写任何测试)——否则(很可能)您只能等着看您是否碰巧碰到了这个运行时出错,在这种情况下,您可能不得不从输出结果的数据库中放弃许多小时的工作,在 IPython 中用头撞墙尝试手动重现问题,最终发现这是因为 idxmax 只能 报告最大行的 _标签_,然后很失望没有标准函数自动为你获取最大行的 _位置_,自己写一个错误的实现,编辑代码,祈祷你不要再次遇到问题。

原文由 ely 发布,翻译遵循 CC BY-SA 4.0 许可协议

您也可以尝试 idxmax

 In [5]: df = pandas.DataFrame(np.random.randn(10,3),columns=['A','B','C'])

In [6]: df
Out[6]:
          A         B         C
0  2.001289  0.482561  1.579985
1 -0.991646 -0.387835  1.320236
2  0.143826 -1.096889  1.486508
3 -0.193056 -0.499020  1.536540
4 -2.083647 -3.074591  0.175772
5 -0.186138 -1.949731  0.287432
6 -0.480790 -1.771560 -0.930234
7  0.227383 -0.278253  2.102004
8 -0.002592  1.434192 -1.624915
9  0.404911 -2.167599 -0.452900

In [7]: df.idxmax()
Out[7]:
A    0
B    8
C    7

例如

In [8]: df.loc[df['A'].idxmax()]
Out[8]:
A    2.001289
B    0.482561
C    1.579985

原文由 Wes McKinney 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题