Python 使用熊猫石斑鱼时,如何获取序列的最大值?

Python 使用熊猫石斑鱼时,如何获取序列的最大值?,python,pandas,dataframe,Python,Pandas,Dataframe,我有以下数据帧: 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

我有以下数据帧:

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
我可以使用以下代码片段汇总小时数:

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]))
但是,当人数不同时,这种情况会发生分裂:

           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
当分组恰好导致以下情况时,我如何计算最大人数:

           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
从grouper中删除“People”,并使用
agg
指定
groupby
以另外获取
max
的People

(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
我建议这里不要硬编码级别的原因是为了更好的可维护性。使用
reset\u索引(级别=[0,1,2])
reset\u索引
+
set\u索引
更有效。但是,例如,如果您决定向grouper添加另一列,则需要修改重置索引调用。。。这很好,很漂亮。如果您希望更容易维护的代码,请考虑不要对它们进行硬编码。

< P>使用字典中的聚合函数指定列名称:

hr_df = (hr_df.groupby(['U_ID', 'Group', 'Location', pd.Grouper(key='Date', freq='MS')])
              .agg({'Hours':'sum', 'People':'max'})
              .reset_index(level=[0, 1, 2])
              )
print (hr_df)
            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

它的代码与我的代码相同,但修复了我迄今为止在索引中犯的错误,对吗?今天他们的代码是
。重置索引(级别=[0,1,2,3])
,现在你的答案将更改为
。重置索引(级别=[0,1,2])
。明天如果他们向grouper添加另一列,它将再次成为
.reset\u索引(级别=[0,1,2,3])
。性能是一回事,但性能不是一切。可维护性很重要,这很公平。你也可以自由地为你的理由进行辩论。由OP决定他们喜欢哪一种。显然,这里没有单一的答案。在答案中提出建议和说“不要使用其他人的答案,这不好”是有区别的。我认为你在这里分析的太多了谢谢,现在好多了。