[英]Pandas groupby aggregate to new columns
我有一個看起來像這樣的DataFrame:
A B C D
1 10 22 14
1 12 20 37
1 11 8 18
1 10 10 6
2 11 13 4
2 12 10 12
3 14 0 5
和一個看起來像這樣的函數( 注意:它實際上做了一些更復雜的事情,不能輕易分成三個獨立的調用,但我為了清晰起見而簡化 ):
def myfunc(g):
return min(g), mean(g), max(g)
我想在A
上使用groupby
和myfunc
來獲取B
和C
列的輸出(忽略D
),如下所示:
B C
min mean max min mean max
A
1 10 10.75 12 8 15.0 22
2 11 11.50 12 10 11.5 13
3 14 14.00 14 0 0.0 0
我可以做以下事情:
df2.groupby('A')[['B','C']].agg(
{
'min': lambda g: myfunc(g)[0],
'mean': lambda g: myfunc(g)[1],
'max': lambda g: myfunc(g)[2]
})
但是,除了這個丑陋並且多次調用myfunc
- 我最終還是結束了
max mean min
B C B C B C
A
1 12 22 10.75 15.0 10 8
2 12 13 11.50 11.5 11 10
3 14 0 14.00 0.0 14 0
我可以使用.swaplevel(axis=1)
來交換列級別,但即使這樣, B
和C
也在多個重復列中,並且使用多個函數調用時,感覺就像咆哮錯誤的樹。
如果你安排myfunc
返回一個DataFrame,其列是['A','B','C','D']
,其行索引是['min', 'mean', 'max']
,那么你可以使用groupby/apply
來調用函數(每個組一次)並根據需要連接結果:
import numpy as np
import pandas as pd
def myfunc(g):
result = pd.DataFrame({'min':np.min(g),
'mean':np.mean(g),
'max':np.max(g)}).T
return result
df = pd.DataFrame({'A': [1, 1, 1, 1, 2, 2, 3],
'B': [10, 12, 11, 10, 11, 12, 14],
'C': [22, 20, 8, 10, 13, 10, 0],
'D': [14, 37, 18, 6, 4, 12, 5]})
result = df.groupby('A')[['B','C']].apply(myfunc)
result = result.unstack(level=-1)
print(result)
版畫
B C
max mean min max mean min
A
1 12.0 10.75 10.0 22.0 15.0 8.0
2 12.0 11.50 11.0 13.0 11.5 10.0
3 14.0 14.00 14.0 0.0 0.0 0.0
對於可能遇到此問題並且不需要自定義函數的其他人,請注意,如果可能,您應始終使用內置聚合器 (如下所示,由字符串'min'
, 'mean'
和'max'
)。 它們比自定義Python函數表現更好。 令人高興的是,在這個玩具問題中,它會產生預期的結果:
In [99]: df.groupby('A')[['B','C']].agg(['min','mean','max'])
Out[99]:
B C
min mean max min mean max
A
1 10 10.75 12 8 15.0 22
2 11 11.50 12 10 11.5 13
3 14 14.00 14 0 0.0 0
這樣的事可能有用。
df2.groupby('A')[['B','C']]
aggregated = df2.agg(['min', 'mean', 'max'])
然后你可以使用交換級別來獲取交換的列順序
aggregated.columns = aggregated.columns.swaplevel(0, 1)
aggregated.sortlevel(0, axis=1, inplace=True)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.