Python Pandas Dataframe select row by max value in group

前端 未结 2 825
广开言路
广开言路 2020-12-13 06:50

I have a dataframe which was created via a df.pivot:

type                             start  end
F_Type         to_date                     
A              2         


        
相关标签:
2条回答
  • 2020-12-13 07:30

    The other ways to do that are as follow:

    1. If you want only one max row per group.
    (
        df
        .groupby(level=0)
        .apply(lambda group: group.nlargest(1, columns='to_date'))
        .reset_index(level=-1, drop=True)
    )
    
    1. If you want to get all rows that are equal to max per group.
    (
        df
        .groupby(level=0)
        .apply(lambda group: group.loc[group['to_date'] == group['to_date'].max()])
        .reset_index(level=-1, drop=True)
    )
    
    0 讨论(0)
  • 2020-12-13 07:38

    A standard approach is to use groupby(keys)[column].idxmax(). However, to select the desired rows using idxmax you need idxmax to return unique index values. One way to obtain a unique index is to call reset_index.

    Once you obtain the index values from groupby(keys)[column].idxmax() you can then select the entire row using 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
    

    Note: idxmax returns index labels, not necessarily ordinals. After using reset_index the index labels happen to also be ordinals, but since idxmax is returning labels (not ordinals) it is better to always use idxmax in conjunction with df.loc, not df.iloc (as I originally did in this post.)

    0 讨论(0)
提交回复
热议问题