我有以下数据帧:
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
解决方法:
从石斑鱼中删除“人物”并使用agg指定groupby以额外占用最多的人.
(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_index(level = [0,1,2])比reset_index set_index更高效.但是,例如,如果您决定向石斑鱼添加另一列,则需要修改重置索引调用…这很好,花花公子.如果您想要更易于维护的代码,请考虑不对其进行硬编码.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。