2017-05-28 59 views
2

我與一些數據工作,想拉最大的某列,由不同的列進行分組。但是,我想根據另一列排除最大計算中的某些行。Python的大熊貓組基於列的和獲得最大的,但不包括基於另一列

例子:

df = pd.DataFrame({'Col1':['A','A','A','B','B','B','B'], 
        'Col2':['Build','Plan','Other','Test','Build','Other','Buy'], 
        'Col3':[2,5,17,5,13,12,12]}) 

我想COL3的最大值,通過Col1中進行分組,同時排除有「其他」 col2的任何行。因此,對於col3的「A」的最大應爲5,而不是17

我能得到利用Col1中分組COL3的最大值:df['new'] = df.groupby(['Col1'])['Col3'].transform(max)然而,這會給我的17值A.

從其他線程環顧四周,我嘗試使用:

x = df1.groupby(['Col1']) 
x2 = x.apply(lambda g: g[g['Col2'] != 'Other']) 

,這似乎讓我接近的(它具有Col1中分組的數據,並移除行基於col2的)。然而,我似乎無法找到一種方法來獲得基於Col1的Col3的最大值。

至多我已經能夠使用:x2['Col3'].max()獲取Col3中所有具有「其他」的行之後的最大值。但是,我無法獲得由Col1分組的Col3的最大值。

我在想,如果有使用內置熊貓功能來做到這一點相對簡單,而不是創建一個全新的定製功能的方式是什麼?

+1

通過Col1中第一過濾您的數據幀,然後組混合起來。 –

+1

df.query( 'col2的!= 「其他」')。GROUPBY( 'Col1中') 'COL3']。MAX() –

+0

謝謝你,工作:) – pyman

回答

3

您可以嘗試

df[df.Col2 != 'Other'].groupby('Col1').Col3.max() 

Col1 
A  5 
B 13 

要創建新列:

df['new']=df[df.Col2 != 'Other'].groupby('Col1').Col3.transform('max') 
df['new'] = df.new.ffill() 

    Col1 Col2 Col3 new 
0 A  Build 2  5.0 
1 A  Plan 5  5.0 
2 A  Other 17  5.0 
3 B  Test 5  13.0 
4 B  Build 13  13.0 
5 B  Other 12  13.0 
6 B  Buy  12  13.0 

說明:只選擇DF的行,其中col2的值不等於 '其他',GROUPBY Col1中,找到Col3的最大值。

Here是變換的文檔: 它返回一個類似索引的df與變換值而不是聚合。

+0

@Scott波士頓,事實上我想知道如果我應該因爲你已經在評論中回答:) – Vaishali

+2

@ A-Za-z:絕不會讓那些應該更好地濫用評論部分的人阻止你發佈。 ;-) – DSM

+0

太棒了,謝謝你!無論你的答案的工作:) 你會知道如何創建一個新的列,我呼籲,基於在Col1中的值來計算最大?基本上使得: DF = pd.DataFrame({ 'Col1中':[ 'A', 'A', 'A', 'B', 'B', 'B', 'B'], 'col2的' :['Build','Plan','Other','Test','Build','Other','Buy'], 'Col3':[2,5,17,5,13,​​12,12 ], '新':[5,5,5,13,​​13,13,13]}) 我試圖DF [ '新'] = A [(DF [ 'Col1中'])],但是這似乎沒有工作。我收到以下錯誤:無法從重複軸重新索引 – pyman

1

另一種方式來使用groupby

df.groupby([df.Col2.ne('Other'), 'Col1']).Col3.max()[True] 

Col1 
A  5 
B 13 
Name: Col3, dtype: int64