[英]Pandas groupby aggregate passing group name to aggregate
在一种常见用法模式中,我需要使用自定义聚合函数来聚合DataFrame。 在这种特殊情况下,聚合功能需要知道当前组才能正确执行聚合。
为每个组和每个列调用传递给DataFrameGroupBy.aggregate()
函数,以接收具有当前组和列中的元素的Series。 我发现从聚合函数内部获取组名的唯一方法是将分组列添加到索引,然后使用x.index.get_level_values('power')[0]
提取值。 这里是一个例子:
def _tail_mean_user_th(x):
power = x.index.get_level_values('power')[0]
th = th_dict[power] # this values changes with the group
return x.loc[x > th].mean() - th
mbsize_df = (bursts_sel.set_index('power', append=True).groupby('power')
.agg({'nt': _tail_mean_user_th}))
在我看来,聚合函数需要了解当前组是很常见的情况。 在这种情况下是否有更直接的模式?
编辑 :我接受下面包括使用该解决方案apply
,而不是agg
的的GroupBy对象。 两者之间的区别在于, agg
为每个组和每个列调用函数,而apply
则为每个组(一次所有列)调用函数。 一个细微的后果是, agg
将为当前组和列传递一个Series
,其name
属性等于原始列的名称。 相反, apply
将传递一个name
属性等于当前组的Series
(这是我的问题)。 有趣的是,当对多列进行操作时, apply
将传递一个具有设置为组名的name
属性(对于DataFrames通常不存在)的DataFrame。 因此,当一次聚合多个列时,此模式也适用。
有关更多信息,请参见pandas agg和apply函数之间的区别是什么?
如果使用groupby
+ apply
,则可以通过.name
属性使用它:
df = pd.DataFrame({'a': [1, 2, 1, 2], 'b': [1, 1, 2, 2]})
def foo(g):
print('at group %s' % g.name)
return int(g.name) + g.sum()
>>> df.b.groupby(df.a).apply(foo)
at group 1
at group 2
a
1 4
2 5
Name: b, dtype: int64
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.