【问题标题】:n highest values in dataframe数据框中的 n 个最大值
【发布时间】:2019-09-10 00:01:56
【问题描述】:

我有一个 pandas 数据框,例如:

        column0     column1     column2     column3     column4
row0    179319.0    180895.0    94962.0     130734.0    0
row1    89659.5     90447.5     47481.0     65367.0     0
row2    59773.0     60298.33333 31654.0     43578.0     0
row3    44829.75    45223.75    23740.5     32683.5     0
row4    35863.8     36179.0     18992.4     26146.8     0
row5    29886.5     30149.16666 15827.0     21789.0     0
row6    25617.0     25842.14285 13566.0     18676.28571 0
row7    22414.875   22611.875   11870.25    16341.75    0
row8    19924.33333 20099.44444 10551.33333 14526.0     0

我想获得类似于 9(行数)最高值的索引,或者类似于每列最高值的计数,例如:

column0  column1  column2  column3  column4
3        3        1        2        0

在我的示例中,9 个最高值将是来自 row0 的 column0、column1、column2 和 column3 的值,来自 row1 的 column0、column1 和 column3 的值,以及来自 row2 的 column0 和 column1 的值。

有什么想法吗?谢谢!

【问题讨论】:

  • 我刚刚编辑了我的问题以使其更清楚。
  • 如果两个单元格之间的第 9 个最大值出现平局怎么办?您只想要任何一个索引,还是返回第 9 个的所有平局是否有用(有效地允许您获得超过 9 个计数)?
  • 我没有考虑过这一点,但我想说这两种解决方案都适合我的目的(随机一种或两种)。

标签: python pandas max


【解决方案1】:

IIUC nlargeststack 之后

df.stack().nlargest(9).groupby(level=1).count().reindex(df.columns,fill_value=0)
Out[48]: 
column0    3
column1    3
column2    1
column3    2
column4    0
dtype: int64

【讨论】:

  • 谢谢!正是我想要的。
【解决方案2】:

IIUC,可以堆叠排序,

df.stack().sort_values(ascending = False).iloc[:9]

row0  column1    180895.00000
      column0    179319.00000
      column3    130734.00000
      column2     94962.00000
row1  column1     90447.50000
      column0     89659.50000
      column3     65367.00000
row2  column1     60298.33333
      column0     59773.00000

【讨论】:

    【解决方案3】:

    pandas 有一个名为nlargest 的函数,它将以序列的形式返回任何列的最大值。 [docs]

    如果您只想要每个索引,那么您可以使用index.values [usage] [docs] 或者您可以使用.index.array,如docs 中所推荐的那样。

    如果您想要计算所有最高值,请查看this answer here

    【讨论】:

    • 我的问题是我想要数据框的最高值,而不仅仅是一个列表。我需要确定所有这些值在哪里(行和列)。
    • 知道了,我会把我的答案作为对一些文档的参考。 Wen-Ben 和 Vaishali 对您所澄清的内容提供了有用的答案。
    【解决方案4】:

    这是一个使用np + collections.Counter 的解决方案,它应该很快就能获得 Counter 对象。

    from collections import Counter
    import numpy as np
    import pandas as pd
    
    c = Counter(np.tile(df.columns, df.shape[0])[np.argsort(df.to_numpy().ravel())[-9:]])
    #Counter({'column0': 3, 'column1': 3, 'column2': 1, 'column3': 2})
    
    s = pd.Series(c).reindex(df.columns).fillna(0).astype(int)
    #column0    3
    #column1    3
    #column2    1
    #column3    2
    #column4    0
    #dtype: int32
    

    【讨论】:

      猜你喜欢
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-12
      • 1970-01-01
      • 2020-05-26
      • 2020-07-21
      • 2019-07-19
      相关资源
      最近更新 更多