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