如果“值”中的值对于每个“类别”都是唯一的(如示例中所示),我们可以:
(一)
groupby
“类别”并选择“值”列
(ii)找出每组的第一个和最后一个元素
(iii)创建一个布尔掩码,标识每个组的第一个和最后一个元素
(iv)戴上口罩
df['Value']
并指定0。
gb_obj = df.groupby('Category')['Value']
firsts = gb_obj.transform('first')
lasts = gb_obj.transform('last')
msk = (df['Value'] == firsts) | (df['Value'] == lasts)
df.loc[msk, 'Value'] = 0
如果没有,我们可以对“值”应用一个函数,将0分配给每个组中的第一个和最后一个元素:
def first_last_to_zero(g):
g.iloc[0] = g.iloc[-1] = 0
return g
df['Value'] = df.groupby('Category')['Value'].apply(first_last_to_zero)
输出:
Category Value
0 2000-1 0
1 2000-1 200
2 2000-1 20
3 2000-1 0
4 2000-2 0
5 2000-2 210
6 2000-2 0
7 3000-1 0
8 3000-1 370
9 3000-1 0
10 4000-3 0
11 4000-3 92
12 4000-3 0
13 4000-5 0
14 4000-5 77
15 4000-5 0