簡體   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