Python Pandas Dataframe sélectionner une ligne par valeur max dans le groupe

j'ai une base de données qui a été créée via un df.pivot:

type                             start  end
F_Type         to_date                     
A              20150908143000    345    316
B              20150908140300    NaN    480
               20150908140600    NaN    120
               20150908143000  10743   8803
C              20150908140100    NaN   1715
               20150908140200    NaN   1062
               20150908141000    NaN    145
               20150908141500    418    NaN
               20150908141800    NaN    450
               20150908142900   1973   1499
               20150908143000  19522  16659
D              20150908143000    433     65
E              20150908143000   7290   7375
F              20150908143000      0      0
G              20150908143000   1796    340

je voudrais filtrer et retourner une seule ligne pour chaque 'F_TYPE' retournant seulement la ligne avec le Maximum 'to_date'. J'aimerais revenir à la suite de dataframe:

type                             start  end
F_Type         to_date                     
A              20150908143000    345    316
B              20150908143000  10743   8803
C              20150908143000  19522  16659
D              20150908143000    433     65
E              20150908143000   7290   7375
F              20150908143000      0      0
G              20150908143000   1796    340

Merci..

9
demandé sur user636322 2015-09-08 16:37:20

1 réponses

une approche standard est d'utiliser groupby(keys)[column].idxmax(). Cependant, pour sélectionner les lignes souhaitées en utilisant idxmax vous avez besoin d' idxmax pour retourner les valeurs indicielles uniques. Une façon d'obtenir un index unique est d'appeler reset_index.

une fois que vous obtenez les valeurs de l'indice de groupby(keys)[column].idxmax() Vous pouvez ensuite sélectionner la ligne entière en utilisant df.loc:

In [20]: df.loc[df.reset_index().groupby(['F_Type'])['to_date'].idxmax()]
Out[20]: 
                       start    end
F_Type to_date                     
A      20150908143000    345    316
B      20150908143000  10743   8803
C      20150908143000  19522  16659
D      20150908143000    433     65
E      20150908143000   7290   7375
F      20150908143000      0      0
G      20150908143000   1796    340

Remarque: idxmax index des retoursétiquettes, pas nécessairement des ordinaux. Après l'utilisation de reset_index les étiquettes d'index arriver aussi être ordinaires, mais depuis idxmax renvoie les étiquettes (pas les normales) il est préférable de toujours utiliser idxmax en conjonction avec df.loc, pas df.iloc (comme je l'ai fait à l'origine dans ce post.)

22
répondu unutbu 2015-09-08 14:00:29