我想根据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)
但是,这确实给了我一个错误。
答案 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