2017-02-05 3 views
2

Comment obtenir la plus grande valeur dans une colonne pour chaque valeur unique dans une autre colonne et retourner la même structure de trame de données en arrière. Voici un exemple de fichier de données pandas?Pandas: Obtenez valeur la plus élevée d'une colonne pour chaque valeur unique dans une autre colonne

 reg.nr counter  value  ID2 categ    date 
1  37367  421  231385  93  A  20.01.2004 
2  37368  428  235156  93  B  21.01.2004 
3  37369  408  234251  93  C  22.01.2004 
4  37372  403  196292  93  D  23.01.2004 
5  55523  400  247141  139  E  24.01.2004 
6  55575  415  215818  139  F  25.01.2004 
7  55576  402  204404  139  A  26.01.2004 
8  69940  402  62244  175  B  27.01.2004 
9  69941  402  38274  175  C  28.01.2004 
10  69942  404  55171  175  D  29.01.2004 
11  69943  416  55495  175  E  30.01.2004 
12  69944  407  90231  175  F  31.01.2004 
13  69945  411  75382  175  A  01.02.2004 
14  69948  405  119129  175  B  02.02.2004 

Où je veux retourner la valeur la plus élevée de la colonne « contre » en fonction de la valeur unique de la colonne « ID2 ». Après la nouvelle Pandas dataframe devrait ressembler à ceci:

 reg.nr counter  value  ID2 categ    date 
1  37368  428  235156  93  B  21.01.2004 
2  55575  415  215818  139  F  25.01.2004 
3  69943  416  55495  175  E  30.01.2004 

Répondre

3

Une façon utilisant drop_duplicates

In [332]: df.sort_values('counter', ascending=False).drop_duplicates(['ID2']) 
Out[332]: 
    reg.nr counter value ID2 categ  date 
2 37368  428 235156 93  B 21.01.2004 
11 69943  416 55495 175  E 30.01.2004 
6 55575  415 215818 139  F 25.01.2004 

Pour la sortie désirée, vous pourriez trier sur deux colonnes, et réinitialiser l'index

In [336]: (df.sort_values(['ID2', 'counter'], ascending=[True, False]) 
      .drop_duplicates(['ID2']).reset_index(drop=True) 
     ) 
Out[336]: 
    reg.nr counter value ID2 categ  date 
0 37368  428 235156 93  B 21.01.2004 
1 55575  415 215818 139  F 25.01.2004 
2 69943  416 55495 175  E 30.01.2004 
+0

Merci John pour la réponse, je l'ai accepté votre réponse parce que le temps d'exécution est 100 fois plus rapide avec votre méthode que la méthode Ilya V. Schurov avec groupe – RaduS

+0

Je ne suis pas très sûr. Je pense que la méthode d'IIya fonctionnerait plus rapidement pour des données plus volumineuses. Vous auriez besoin de le tester sur vos cas d'utilisation. – Zero

+1

sur mon échantillon de 110000 lignes, le vôtre exécuté en 0.031253 secondes, tandis que Ilya en 1.84827 secondes, 60 fois plus rapide ok; mais encore beaucoup mieux – RaduS

1
df.loc[df.groupby('ID2')['counter'].idxmax(), :].reset_index() 

    index reg.nr counter value ID2 categ  date 
0  2 37368  428 235156 93  B 21.01.2004 
1  6 55575  415 215818 139  F 25.01.2004 
2  11 69943  416 55495 175  E 30.01.2004 

D'abord, vous regroupez votre dataframe par colonne ID2. Ensuite, vous obtenez la colonne counter et calculez un index du (premier) élément maximal de cette colonne dans chaque groupe. Ensuite, vous utilisez ces index pour filtrer votre base de données initiale. Enfin, vous réinitialise les index (si vous en avez besoin).

+0

Merci Ilya V. Schurov pour la réponse :) – RaduS