使用pandas Grouper时如何获取系列的最大值?

use*_*882 3 python dataframe pandas

我有以下数据帧:

U_ID     Group   Location  Hours  People  Date
149      17      USA       2      2       2014-11-03
149      17      USA       2      1       2014-11-07
149      21      USA       3      2       2014-12-21
149      18      UK        1.5    1       2014-11-14
149      19      Spain     2      4       2014-11-21
Run Code Online (Sandbox Code Playgroud)

我可以使用以下代码段汇总小时数:

def process_hours(hr_df):
    hr_df['Date'] = pd.to_datetime(hr_df['Date'])
    hr_df['Hours'] = pd.to_numeric(hr_df['Hours'])
    hr_df = (vol_df.groupby(['U_ID', 'Group', 'Location', 'People', pd.Grouper(key='Date', freq='MS')])['Hours'].sum().reset_index(level=[0, 1, 2, 3]))
Run Code Online (Sandbox Code Playgroud)

然而,当人数不同时,这会分裂:

           U_ID Group Location People  Hours
Date                                        
2014-11-01  149    17      USA      1    2.0
2014-11-01  149    17      USA      2    2.0
2014-11-01  149    18       UK      1    1.5
2014-11-01  149    19    Spain      4    2.0
2014-12-01  149    21      USA      2    3.0
Run Code Online (Sandbox Code Playgroud)

如何在分组发生时获取最大人数:

           U_ID Group Location People  Hours
Date                                        
2014-11-01  149    17      USA      2    4.0
2014-11-01  149    18       UK      1    1.5
2014-11-01  149    19    Spain      4    2.0
2014-12-01  149    21      USA      2    3.0
Run Code Online (Sandbox Code Playgroud)

cs9*_*s95 5

从石斑鱼中移除"人物",并agg指定groupby另外选择max人.

(hr_df.groupby(['U_ID', 'Group', 'Location', pd.Grouper(key='Date', freq='MS')])
      .agg({'Hours' : 'sum', 'People' : 'max'})
      .reset_index()  # Don't hardcode levels here.
      .set_index('Date'))

            U_ID  Group Location  Hours  People
Date                                           
2014-11-01   149     17      USA    4.0       2
2014-11-01   149     18       UK    1.5       1
2014-11-01   149     19    Spain    2.0       4
2014-12-01   149     21      USA    3.0       2
Run Code Online (Sandbox Code Playgroud)

我建议不要硬编码级别的原因是为了更好的可维护性.使用reset_index(level=[0, 1, 2])比reset_index+ 更高效set_index.但是,例如,如果您决定向石斑鱼添加另一列,则需要修改重置索引调用...这很好,花花公子.如果您想要更易于维护的代码,请考虑不对其进行硬编码.