有人问过这个问题的变体(请参阅此问题),但我还没有找到一个很好的解决方案,因为这似乎是groupby
Pandas中的一个常见用例。
说我有数据框,lasts
并且按user
以下条件分组:
lasts = pd.DataFrame({'user':['a','s','d','d'],
'elapsed_time':[40000,50000,60000,90000],
'running_time':[30000,20000,30000,15000],
'num_cores':[7,8,9,4]})
我想应用这些函数groupby_obj
(这些函数的作用并不重要,我已经将它们组成了,只知道它们需要数据框中的多列):
def custom_func(group):
return group.running_time.median() - group.num_cores.mean()
def custom_func2(group):
return max(group.elapsed_time) -min(group.running_time)
我可以将apply
每个函数分别与数据框合并,然后合并生成的数据框,但这似乎效率低下,效率低下,我想必须有一个单行解决方案。
尽管这篇博文(在页面底部搜索“创建函数以获取组的统计信息”)建议将这些函数包装成一个函数作为字典,但我还没有真正找到一个:
def get_stats(group):
return {'custom_column_1': custom_func(group), 'custom_column_2':custom_func2(group)}
但是,当我运行代码groupby_obj.apply(get_stats)
而不是列时,会得到一列字典结果:
user
a {'custom_column_1': 29993.0, 'custom_column_2'...
d {'custom_column_1': 22493.5, 'custom_column_2'...
s {'custom_column_1': 19992.0, 'custom_column_2'...
dtype: object
实际上,我想使用一行代码来更接近此数据框:
user custom_column_1 custom_column_2
a 29993.0 10000
d 22493.5 75000
s 19992.0 30000
有关改善此工作流程的建议?
如果您要稍微修改该get_stats
功能:
def get_stats(group):
return pd.Series({'custom_column_1': custom_func(group),
'custom_column_2':custom_func2(group)})
现在您只需执行以下操作:
In [202]: lasts.groupby('user').apply(get_stats).reset_index()
Out[202]:
user custom_column_1 custom_column_2
0 a 29993.0 10000.0
1 d 22493.5 75000.0
2 s 19992.0 30000.0
使用您的功能(不变)的替代方法(有点难看):
In [188]: pd.DataFrame(lasts.groupby('user')
.apply(get_stats).to_dict()) \
.T \
.rename_axis('user') \
.reset_index()
Out[188]:
user custom_column_1 custom_column_2
0 a 29993.0 10000.0
1 d 22493.5 75000.0
2 s 19992.0 30000.0
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句