繁体   English   中英

Pandas groupby汇总传递组名进行汇总

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM