我想将多列的多个函数应用于 groupby 对象,这会产生一个新的pandas.DataFrame
.
我知道如何分步骤完成:
by_user = lasts.groupby('user')
elapsed_days = by_user.apply(lambda x: (x.elapsed_time * x.num_cores).sum() / 86400)
running_days = by_user.apply(lambda x: (x.running_time * x.num_cores).sum() / 86400)
user_df = elapsed_days.to_frame('elapsed_days').join(running_days.to_frame('running_days'))
Which results in user_df
being:
但我怀疑有更好的方法,例如:
by_user.agg({'elapsed_days': lambda x: (x.elapsed_time * x.num_cores).sum() / 86400,
'running_days': lambda x: (x.running_time * x.num_cores).sum() / 86400})
然而,这不起作用,因为据我所知agg()
致力于pandas.Series
.
我确实找到了这个问题和答案 https://stackoverflow.com/q/14529838/3447047,但这些解决方案对我来说看起来相当丑陋,考虑到答案已经有近四年的历史了,现在可能有更好的方法。
解决方案的另一个可靠的变化是做 @MaxU 所做的事情这个解决方案 https://stackoverflow.com/a/43417577/3899919 to 类似的问题 https://stackoverflow.com/questions/43417090/apply-multiple-functions-at-one-time-to-pandas-groupby-object并包装各个功能在熊猫系列中,因此只需要一个reset_index()
返回一个数据帧。
首先,定义转换函数:
def ed(group):
return group.elapsed_time * group.num_cores).sum() / 86400
def rd(group):
return group.running_time * group.num_cores).sum() / 86400
将它们包装在一个系列中使用get_stats
:
def get_stats(group):
return pd.Series({'elapsed_days': ed(group),
'running_days':rd(group)})
Finally:
lasts.groupby('user').apply(get_stats).reset_index()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)