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

Python 熊猫在每一组中找到满足条件的最大值,python,pandas,Python,Pandas,抱歉,如果以前有人问过这个问题,找不到确切的问题 我正在寻找熊猫中最有效的方法来执行以下操作: 假设我们有下表: 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 10

抱歉,如果以前有人问过这个问题,找不到确切的问题

我正在寻找熊猫中最有效的方法来执行以下操作:

假设我们有下表:

    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(而不是null)

结果数据帧将是:

    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以获得max-sub-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
    始终为
    1
    0
备选方案(注意事项较少)
但没那么有趣

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

很不错的!谢谢