【问题标题】:Pandas: find maximum value across all columns and print this row熊猫:找到所有列的最大值并打印这一行
【发布时间】:2019-08-30 23:33:47
【问题描述】:

我有一个大数据框,其中包含标准化和缩放的数据,应该在 0-1 的范围内。但是当我打印它的最大值时,我得到 - 1.000000002。 describe() 方法不显示此值。所以我试图找出问题并想打印有问题的一行。我遇到的所有其他答案都是关于打印具有某一列最大值的行。如何打印包含整个数据帧最大值的行?感谢您的帮助!

test = pd.DataFrame({'att1'  : [0.1, 0.001, 0.0001,
                            1, 2,
                            0.5, 0, -1, -2],
                   'att2':[0.01, 0.0001, 0.00001,
                            1.1, 2.2,
                            2.37, 0, -1.5, -2.5]})
test.max().max()
Out: 2.37000

理想的结果:

    att1    att2
5   0.5     2.37

统一更新: 我更新了测试数据框,因为它引起了混乱(我的错!)。我需要打印一行,其中包含整个数据帧的最大值。

【问题讨论】:

    标签: python-3.x pandas


    【解决方案1】:

    我在stack 之后在这里使用idxmax

    test.iloc[[test.stack().idxmax()[0]]]
    Out[154]: 
       att1  att2
    5   2.3  2.37
    

    【讨论】:

    • 你为什么使用stack?我认为只是将返回系列从idxmax 传递到iloc 并选择1st 行会比使用堆栈更好:test.iloc[test.idxmax()].head(1)
    • @andy 您假设每列的最大值都显示在同一行中。
    • 是的,基于他的数据。否则,test.iloc[test.idxmax()] 足以显示两行。似乎他想显示att1att2 最大的行。因此,如果 att1_max 与 att2_max 位于不同的行,则显示这两行是有意义的。如果他只需要知道att1_max和att2_max,那么test.agg(['max'])更好
    【解决方案2】:

    让我们使用 np.where 返回行和列索引:

    r, _ = np.where(test.values == np.max(test.values))
    test.iloc[r]
    

    输出:

       att1  att2
    5   2.3  2.37
    

    【讨论】:

      【解决方案3】:

      编辑:
      经过OP的进一步解释,我认为将values数组与values.max()进行比较更灵活,如下所示:

      test[test.values == test.values.max()]
      

      它返回数据帧的max_value行。如果 att1_max 与 att2_max 相同但在不同的行上,则返回两行。在这种情况下,如果单行更可取,请将head(1) 添加到其中。

      att1_max 和 att2_max 在同一行:

      Out[660]:
           att1     att2
      0  0.1000  0.01000
      1  0.0010  0.00010
      2  0.0001  0.00001
      3  1.0000  1.10000
      4  2.0000  2.20000
      5  2.3000  2.37000
      6  0.0000  0.00000
      7 -1.0000 -1.50000
      8 -2.0000 -2.50000
      
      In [661]: test[test.values == test.values.max()]
      Out[661]:
         att1  att2
      5   2.3  2.37
      

      att1_max 和 att2_max 在不同的行上:

      Out[664]:
           att1     att2
      0  0.1000  0.01000
      1  0.0010  0.00010
      2  0.0001  0.00001
      3  1.0000  1.10000
      4  2.0000  2.20000
      5  2.3000  1.37000
      6  0.0000  0.00000
      7 -1.0000 -1.50000
      8 -2.0000 -2.50000
      
      In [665]: test[test.values == test.values.max()]
      Out[665]:
         att1  att2
      5   2.3  1.37
      

      att1_max 与 att2_max 相同,但在不同的行上(这种情况 stack 只返回 1 行,而这会返回两行)

      Out[668]:
            att1      att2
      0   0.1000   0.01000
      1  25.0500   0.00010
      2   0.0001   0.00001
      3   1.0000   1.10000
      4   2.0000   2.20000
      5   2.3000   1.37000
      6   0.0000   0.00000
      7  -1.0000  25.05000
      8  -2.0000  -2.50000
      
      In [669]: test[test.values == test.values.max()]
      Out[669]:
          att1     att2
      1  25.05   0.0001
      7  -1.00  25.0500
      

      注意:在最后一种情况下,如果需要返回单,只需添加head(1)

      In [670]: test[test.values == test.values.max()].head(1)
      Out[670]:
          att1    att2
      1  25.05  0.0001    
      

      注意 2:如果 att1_max 和 att2_max 相同且在同一行,则该行将显示两次。在那种情况下使用drop_duplicates() 来处理它

      原文:

      @Wen-Ben 的回答很好,但我认为在这里使用stack 是不必要的。我更喜欢idxmaxdrop_duplicates

      test.iloc[test.idxmax()].drop_duplicates()    
      

      test.loc[test.idxmax().drop_duplicates()]
      

      att1_max 和 att2_max 在同一行:

      In [510]: test.iloc[test.idxmax()].drop_duplicates()
      Out[510]:
         att1  att2
      5   2.3  2.37
      

      att1_max 和 att2_max 在不同的行上:

      In [513]: test.iloc[test.idxmax()].drop_duplicates()
      Out[513]:
         att1  att2
      5   2.3  1.37
      4   2.0  2.20
      

      所以,att1_max 和 att2_max 在同一行,返回精确的 1 行。 att1_max 和 att2_max 在不同的行,返回 att1_max 和 att2_max 存在的 2 行。

      【讨论】:

      • 嗨!我只需要打印包含整个数据帧最大值的行。所以第二个例子中的结果应该只是索引为 5 的行。
      • 啊,我明白了。如果 att1_max 与 att2_max 的值相同但它们位于不同的行上,您要显示两行还是任一行?
      • @aviss Ummm 我认为这就是我使用堆栈的原因。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-16
      • 2020-03-21
      • 2019-10-15
      • 2017-11-27
      • 1970-01-01
      • 2022-11-02
      相关资源
      最近更新 更多