熊猫在每组中找到满足条件的最大值

问题描述:

对不起,如果之前询问过,找不到确切的问题。熊猫在每组中找到满足条件的最大值

我寻找大熊猫的最有效的方法来进行以下操作:

假设我们有如下表:

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 

有关这样做的其他想法?

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