如何在pandas的数据框中检索k个最高值?

时间:2017-08-16 15:52:31

标签: python pandas numpy dataframe max

如何在pandas的数据框中检索k个最高值?

例如,给定DataFrame:

               b         d         e
Utah    1.624345 -0.611756 -0.528172
Ohio   -1.072969  0.865408 -2.301539
Texas   1.744812 -0.761207  0.319039
Oregon -0.249370  1.462108 -2.060141

生成于:

import numpy as np
import pandas as pd
np.random.seed(1)
frame = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'), 
                     index=['Utah', 'Ohio', 'Texas', 'Oregon'])
print(frame)

数据框中的3个最高值是:

  1. 1.744812
  2. 1.624345
  3. 1.462108

6 个答案:

答案 0 :(得分:9)

您可以使用pandas.DataFrame.stack + pandas.Series.nlargest,例如:

In [183]: frame.stack().nlargest(3)
Out[183]:
Texas   b    1.744812
Utah    b    1.624345
Oregon  d    1.462108
dtype: float64

或:

In [184]: frame.stack().nlargest(3).reset_index(drop=True)
Out[184]:
0    1.744812
1    1.624345
2    1.462108
dtype: float64

答案 1 :(得分:3)

有趣numpy

np.partition(df.values.ravel(), df.size - 3)[-1:-4:-1]

array([ 1.744812,  1.624345,  1.462108])

细分

  1. np.partition将一维数组拆分为最小k和最大n - k
  2. 我需要以1-d的方式获得df的值
  3. 在这种情况下,
  4. ndf的总大小,k是3
  5. [-1:-4:-1]表示从-1开始,一直走到-4但不包括-4,采取步骤-1 ...转换为从最后一个开始的最后3个元素。
  6. #  1                   2           3        4
    #  |                   |           |        |
    #  v                   v           v        v
    np.partition(df.values.ravel(), df.size - 3)[-1:-4:-1]
    

答案 2 :(得分:3)

除了其他不错的解决方案,这也有效:

>>>df_values = frame.values.ravel()                                        
>>>df_values[df_values.argsort()[:3]]
array([-2.3015387 , -2.06014071, -1.07296862])
>>> 

答案 3 :(得分:1)

另一种方式:

a = frame.values.flatten()
a.sort()
a[-3:]

答案 4 :(得分:1)

您可以对框架中的所有项目进行排序,选择最后3项。

最后,翻转数组的顺序。

 np.flipud(
     np.sort(frame, axis=None)[-3:])

答案 5 :(得分:1)

或者您可以使用operatorfunctools

sorted(functools.reduce(operator.concat, df.values.tolist()),reverse=True)[0:3]