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

标签 python pandas dataframe row argmax

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

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

最佳答案

使用 Pandas 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 中的整数位置,您必须手动获取它(现在允许重复的行标签,这可能会很棘手)。


历史注释:

  • idxmax() 曾经被称为 argmax() prior to 0.11
  • argmax was deprecated prior to 1.0.0 and removed entirely in 1.0.0
  • 从 Pandas 0.16 开始,argmax 曾经存在并执行相同的功能(尽管运行速度似乎比 idxmax 慢)。
  • argmax 函数返回整数位置 在最大元素的行位置索引内。
  • pandas 开始使用行标签而不是整数索引。位置整数索引过去很常见,比标签更常见,尤其是在重复行标签很常见的应用程序中。

例如,考虑这个带有重复行标签的玩具 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 会正确地提供最大值的 positional 位置行(在本例中为位置 9)。

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

因此,您只能希望您的单元测试涵盖所有内容(他们没有,或者更可能没有人编写任何测试)- 否则(很可能)您只能等待,看看您是否碰巧在运行时遇到此错误,在这种情况下,您可能不得不从您输出结果的数据库中花费数小时的工作,在 IPython 中将头撞到墙上,试图手动重现该问题,最后弄清楚它是因为idxmax只能报告最大行的label,然后对没有标准函数自动获取位置感到失望em> 为您准备的最大行,自己编写一个错误的实现,编辑代码,并祈祷您不会再次遇到问题。

关于python - 在 pandas DataFrame 中查找列的值最大的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10202570/

相关文章:

python - 如何使用 get_dummies 从现有列创建新列

python - Pandas 条件语句和添加列

python - 无法导入 tweepy(Python 3.7 - tweepy 3.5)

python - 将第一个单元格与行和计数匹配的其他值进行比较

python - 将 CSV 缩减采样 10 倍并将其保存到另一个文件中

python - 将数组与文件进行比较,并根据数组元素形成组

python - 匹配来自两个不同数据帧的列值和配对观察

r - 考虑另一列中的变量,查找同一列中的不匹配项

python - pytorch Dataset.__getitem__ 是否必须返回字典?

python - 在 Python 中创建找到的单词数组