2016-12-29 87 views
2

對不起,如果之前詢問過,找不到確切的問題。熊貓在每組中找到滿足條件的最大值

我尋找大熊貓的最有效的方法來進行以下操作:

假設我們有如下表:

ID SUB_ID COND 

1 101  1  1 
2 101  2  1 
3 101  3  1 
4 102  1  1 
5 102  2  0 
6 103  1  0 
7 103  2  0 
8 103  3  0 
9 103  4  0 

基本上,每個「ID」我們希望得到最大的「SUB_ID」,,因爲COND是1。理想情況下,我們希望將該值添加到該ID的每一行作爲新列。如果沒有該ID的行滿足條件,我們想補充(而不是零)0

得到的數據幀將是:只有

ID SUB_ID COND MAX_SUB_ID 

1 101  1  1   3 
2 101  2  1   3 
3 101  3  1   3 
4 102  1  1   1 
5 102  2  0   1 
6 103  1  0   0 
7 103  2  0   0 
8 103  3  0   0 
9 103  4  0   0 

我能想出現在最好的辦法是選擇COND = 1的行,然後在該數據幀上執行groupby以獲取最大子ID,然後將其加回到主數據幀。在此之後,我可以將空值更改回0.

df_true = df[df['COND']==1] 
max_subid_true=df_true['SUB_ID'].groupby(df_true['ID']).max() 

joined_df = df.merge(pd.DataFrame(max_subid_true),how='left',left_on='ID',right_index=True) 
joined_df.loc[pd.isnull(joined_df['SUB_ID_y']),'SUB_ID_y']=0 

有關這樣做的其他想法?

回答

1
df.assign(MAX_SUB_ID=df.SUB_ID.mul(df.COND).groupby(df.ID).transform('max')) 

    ID SUB_ID COND MAX_SUB_ID 
1 101  1  1   3 
2 101  2  1   3 
3 101  3  1   3 
4 102  1  1   1 
5 102  2  0   1 
6 103  1  0   0 
7 103  2  0   0 
8 103  3  0   0 
9 103  4  0   0 

警告

  • 假定SUB_ID總是正
  • 假定COND總是10

替代(用更少的警告)
但樂趣卻少了

df.assign(MAX_SUB_ID=df.ID.map(df.query('COND == 1').groupby('ID').SUB_ID.max()) \ 
    .fillna(0).astype(int)) 
+0

很不錯的!謝謝 – user4505419

相關問題