2017-04-08 214 views
2

我在熊貓數據框中有數據,並且需要對它進行聚合。我需要在類似於下面的不同列上進行不同的聚合。如何使用pandas groupby實現多個聚合,引用特定列

group min(rank) min(rank) min sum 

title t_no  t_descr  rank stores 
A  1   a   1  1000 
B  1   a   1  1000 
B  2   b   2  800 
C  2   b   2  800 
D  1   a   1  1000 
D  2   b   2  800 
F  4   d   4  500 
E  3   c   3  700 

到:

title t_no  t_descr  rank stores 
A  1   a   1  1000 
B  1   a   1  1800 
C  2   b   2  800 
D  1   a   1  1800 
E  3   c   3  700 
F  4   d   4  500 

你會發現,標題B和d已經彙總,保持T_NR中& t_descr是對應的最低軍銜爲各自的題目組,而商店總結。 t_no & t_descr只是任意文本。我需要按冠軍頭銜排名,總結商店,並保留相應的t_no & t_descr。

我該如何在一個熊貓羣體中做到這一點?這是虛擬數據;我正在處理的真正問題有更多的聚合,我不想單獨做每個聚合,我知道該怎麼做。

我從下面開始,但是意識到我真的需要t_no & t_descr的最大值是基於子組的排列,而不是列本身。

aggs = { 
'rank': 'min', 
't_no': 'min', # need t_no for row that is min(rank) by title. 
't_descr': 'min' # need t_descr for row that is min(rank) by title. 
} 

df2.groupby('title').agg(aggs).reset_index() 

也許有辦法用lambda來做到這一點?我確信有一個簡單的方法來做到這一點。如果groupby不是正確的方法,我顯然會接受建議。

謝謝!

+0

加入它,我發佈了一個答案是與你的嘗試類似,但後來意識到你正在嘗試做一些不同的事情。如果您更改了「t_descr」的字母順序以顯示該列基於另一列的最小值而不是自己的最小值的示例,將會有所幫助。 – pshep123

+0

嘿@ pshep123感謝您的評論!我更新了一下這個例子。爲了解釋,t_no和t_descr只是隨機文本字段。我需要按照標題保留與排名最小值相關的字段。 – claybot

+0

更改B或D中的「t_descr」以顛倒字母順序,您的示例將突出顯示該需求。當前代碼中找到't_descr'的最小值,儘管使用了不正確的邏輯,但仍會產生所需的結果。 – pshep123

回答

1

兩個步驟...
總門店之和爲idxmin ... rank
然後使用idxmin切片原始數據框,並與總

agged = df.groupby('title').agg(dict(rank='idxmin', stores='sum')) 
df.loc[agged['rank'], ['title', 't_no', 't_descr', 'rank']].join(agged.stores, on='title') 

    title t_no t_descr rank stores 
0  A  1  a  1 1000 
1  B  1  a  1 1800 
3  C  2  b  2  800 
4  D  1  a  1 1800 
7  E  3  c  3  700 
6  F  4  d  4  500 
+0

謝謝!這正是我需要的。真的很感謝幫助。 – claybot

0

這是@piRSquared稍微不同的方法,但可以讓你在同一個地方:

代碼:

# Set min and sum functions according to columns and generate new dataframe 
f = {'rank':min, 'rank':min, 'stores':sum} 
grouped = df.groupby('title').agg(f).reset_index() 

# Then merge with original dataframe (keeping only the merged and new columns) 
pd.merge(grouped, df[['title','rank','t_no','t_descr']], on=['title','rank']) 

輸出:

title stores rank t_no t_descr 
0  A 1000  1  1  a 
1  B 1800  1  1  a 
2  C  800  2  2  b 
3  D 1800  1  1  a 
4  E  700  3  3  c 
5  F  500  4  4  d 

當然您可以按照您認爲合適的方式組織這些列。

+0

真的很感謝幫助,但這個解決方案對我不起作用 - @ piRsquared的答案就是我需要的。謝謝! – claybot

相關問題