2017-08-16 1 views
3

Comment puis-je récupérer les k valeurs les plus élevées dans une trame de données dans pandas?Comment puis-je récupérer les k valeurs les plus élevées dans un bloc de données dans les pandas?

Par exemple, compte tenu de la trame de données:

   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 

Réalisé avec:

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) 

Les 3 valeurs les plus élevées dans la trame de données sont:

  1. 1,744812
  2. 1,624345
  3. 1.462108

Répondre

8

Vous pouvez utiliser pandas.DataFrame.stack + pandas.Series.nlargest, .: par exemple

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

ou:

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

Merci, j'avais manqué [ 'pandas.DataFrame.stack'] (https://pandas.pydata.org/pandas-docs/stable /generated/pandas.DataFrame.stack.html) –

+1

@FranckDernoncourt, heureux je pourrais aider :) – MaxU

3

Fun avec numpy

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

array([ 1.744812, 1.624345, 1.462108]) 

Répartition

  1. np.partition divise l'un tableau 1-d dans le plus petit k et le plus grand n - k
  2. je dois obtenir des valeurs de df dans un 1-d façon
  3. n dans ce cas est la taille totale de df, k est 3
  4. [-1:-4:-1] signifie, commencer à -1, aller jusqu'à -4 mais en n'incluant pas -4 en prenant des mesures de taille -1 ... se traduit par les 3 derniers éléments en commençant par le dernier en premier.

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

wow - il semble vraiment gentil! ça va me prendre un peu de temps pour le comprendre ... – MaxU

+1

Je viens de faire pire (-: – piRSquared

+1

il y a une chose que je ne comprends pas - pourquoi 'df.size - 3'? Pouvez-vous s'il vous plaît expliquer? – MaxU

1

encore une autre façon:

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

Outre les autres solutions agréables, cela fonctionne aussi:

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

Vous pouvez trier tous les éléments du cadre, sélectionnez les 3 derniers articles.

Enfin, inversez l'ordre de la matrice.

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

Ou vous pouvez en utilisant operator, functools

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