2017-09-14 57 views
0

因此,這是我完整問題的簡化版本,但如果它更通用,希望可以幫助更多人。在數據框中選擇列匹配並採取最大值的行

因此,我使用的是一個任意大的熊貓數據框(大到不能寫一堆簡單的條件)。說它看起來像這樣:

member group score 
1   1  56 
1   1  432 
1   1  43 
2   1  44 
2   1  555 
2   2  90 
2   2  101 

而且說這個名單持續了很長一段時間。我的目標是隻比較他們有相同成員和組的行的得分,並且不僅取得這些行的最大值,而且還取得最大值的多少,並將其存儲在新的數據框中。例如,完成數據幀將如下所示:

member group max max by 
1   1  432 376 
2   1  555 511 
2   2  101 11 

我不知道,我還沒有發現任何提示,如何比較喜歡的行不言df['member'==1],但也有成員太多不同的值併爲我組合這樣做。先謝謝你!

+0

你說的「如何最大是多大」是什麼意思? – DyZ

+0

你能解釋爲什麼它是376而不是389 – Wen

回答

1

據我瞭解,你想知道的最多各組和最大多少比組的第一行中的得分更高:

df1 = df.groupby(["group", "member"]).agg(["first", "max"]).reset_index() 
df1.columns = "member", "group", "first", "max" 
df1["max by"] = df1["max"] - df1["first"] 
# member group first max max by 
#0  1  1  56 432  376 
#1  1  2  44 555  511 
#2  2  2  90 101  11 
1

使用np.ptp 進口大熊貓作爲PD 進口numpy的爲NP

df.groupby(['member','group'])['score'].agg({'max':'max','max by':np.ptp}).reset_index() 
Out[8]: 
    member group max max by 
0  1  1 432  389 
1  2  1 555  511 
2  2  2 101  11 

編輯:我會繼續在這裏 「撥錯」 一:)因爲我喜歡這個np.ptp

在這裏你去:〜)

df.groupby(['member','group'])['score'].agg({'max':'max','max by':lambda g: g.max() - g.iloc[0]}).reset_index() 
Out[17]: 
    member group max max by 
0  1  1 432  376 
1  2  1 555  511 
2  2  2 101  11 
+0

我認爲在第一排有一個錯誤。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅ現在可以嗎?〜:) – Wen

+0

不,它需要是376,而不是389 ..我認爲 –

1

類似DYZ's answer,乾淨了一點。

df.groupby(['member', 'group']).score.agg(['max', 'first']) 
df = df.assign(max_by=df.diff(-1, axis=1)['max'])\ 
         .drop('first', 1).reset_index() 
df 

    member group max max_by 
0  1  1 432 376.0 
1  2  1 555 511.0 
2  2  2 101 11.0 
0

我想刪除列first是沒有必要的,清潔是後assign減去列重命名爲:

df = (df.groupby(['member', 'group'])['score'] 
     .agg(['max', 'first']) 
     .assign(first = lambda x: x['max'] - x['first']) 
     .rename(columns={'first':'max by'}) 
     .reset_index()) 
print (df) 
    member group max max by 
0  1  1 432  376 
1  2  1 555  511 
2  2  2 101  11