这个问题的变体已经被问过了(请参见这个问题),但我还没有找到一个好的解决方案,似乎是Pandas中groupby
的常见用例。
假设我有一个名为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)
我可以将这些函数分别应用于数据框,并将结果数据框合并,但是这似乎效率低下、缺乏优雅的解决方案,我想象中应该有一种单行解决方案。
虽然我还没有找到这种方法,但是此博客文章(在页面底部搜索“Create a function to get the stats of a group”)建议将这些函数包装成一个字典形式的函数:
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
改进此工作流程的建议?