2017-08-16 61 views
3

如何檢索熊貓數據框中的k個最高值?如何檢索熊貓數據框中的k個最高值?

例如,給定的數據幀:

   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

回答

8

您可以使用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 
+0

謝謝,我已經錯過了['pandas.DataFrame.stack'](https://pandas.pydata.org/pandas-docs/stable /generated/pandas.DataFrame.stack.html) –

+1

@FranckDernoncourt,很高興我可以幫助:) – MaxU

3

numpy

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

array([ 1.744812, 1.624345, 1.462108]) 

擊穿

  1. np.partition拆分1-d陣列到最小k和最大n - k
  2. 我需要在df的值在這種情況下獲得一個1-d方式
  3. n是的df總規模,k是3種
  4. [-1:-4:-1]手段,開始在-1,走了一路-4但不包括-4通過採取步驟的大小-1 ...翻譯成最後3個元素開始與最後第一個。

# 1     2   3  4 
# |     |   |  | 
# v     v   v  v 
np.partition(df.values.ravel(), df.size - 3)[-1:-4:-1] 
+1

哇 - 它看起來非常好!它會帶我一些時間來了解它... – MaxU

+1

我只是讓事情變得更糟( - :?? – piRSquared

+1

有一件事我不明白 - 爲什麼'df.size - 3'能否請您解釋一下 – MaxU

1

另一種方式:

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

除了其他很好的解決方案,這也適用:

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

可以在幀中的所有項目進行排序,選擇最後3項。

最後,翻轉數組的順序。

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

,也可以使用operatorfunctools

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