在groupby熊猫中有条件地设置值

时间:2019-05-24 11:39:23

标签: python pandas

我想根据groupby的条件在数据集中设置一个值。 val仅在其组中最大的情况下才显示,否则我要显示0

所以:

id     val    
1      3
1      2
1      4
2      1
2      5
3      4

应成为:

id     val    
1      0
1      0
1      4
2      0
2      5
3      4

我尝试过这样的事情:

def f(x):
    if x == max(x):
        return x
    else:
        return 0

train.groupby("id")["val"].transform(f)

但是,这确实给了我一个错误。

2 个答案:

答案 0 :(得分:1)

使用DataFrame.loc根据条件设置值:

df.loc[df.groupby("id")["val"].transform('max').ne(df['val']), 'val'] = 0
print (df)
   id  val
0   1    0
1   1    0
2   1    4
3   2    0
4   2    5
5   3    4

详细信息

#get max value to Series
print (df.groupby("id")["val"].transform('max'))
0    4
1    4
2    4
3    5
4    5
5    4
Name: val, dtype: int64

#compare for not equal with original values
print (df.groupby("id")["val"].transform('max').ne(df['val']))
0     True
1     True
2    False
3     True
4    False
5    False
Name: val, dtype: bool

您的解决方案应更改:

def f(x):
    return np.where(x == x.max(), x, 0)

print (df.groupby("id")["val"].transform(f))

应重写为以下内容:

#equal by eq
df['val'] = np.where(df.groupby("id")["val"].transform('max').eq(df['val']), df['val'], 0)

#not equal by ne - swapped arguments
df['val'] = np.where(df.groupby("id")["val"].transform('max').ne(df['val']), 0, df['val'])

@Chris A,谢谢您提出以下解决方案:

df['val'] = df.groupby('id')['val'].transform('max').eq(df.val).mul(df.val)

答案 1 :(得分:1)

您也可以使用apply

df['val'] = df.groupby('id').val.apply(lambda x: (x==x.max())*x.max())

输出:

    id  val
0   1   0
1   1   0
2   1   4
3   2   0
4   2   5
5   3   4