我有一个数据框,其中包含学生ID及其各自的阶段分数。
我想找到学生被放弃的阶段,即在哪个阶段出现了第一个零分数。然后更新相应的stage flag = 1.Below是样本数据:
StuID | Stage1 | Stage2 | Stage3 | Stage4 | S1Flag |S2Flag |S3Flag | S4Flag
Ak | 80.1 | 23.3 | 0 | 0 | 0 | 0 | 1 | 0
XF | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0
WE | 23 | 34 | 43 | 34 | 0 | 0 | 0 | 0
对于上述数据,对于StuID ='AK',第一个零出现在第3阶段,因此S3 Flag变为1.对于StuID ='XF',第一个零出现在第1阶段,因此S1标志更新为1。并且也可以用于其他行。
答案 0 :(得分:1)
仅Stage
个0
列,按1
进行比较,得到累积总和,因此如果按0
进行比较,请获取第一个m = df.filter(like='Stage').eq(0).cumsum(axis=1).eq(1)
print (m)
Stage1 Stage2 Stage3 Stage4
0 False False True False
1 True False False False
2 False False False False
的掩码:
Flag
然后过滤1
列并按filter
设置cols = df.filter(like='Flag').columns
df[cols] = df[cols].mask(m.values, 1)
print (df)
StuID Stage1 Stage2 Stage3 Stage4 S1Flag S2Flag S3Flag S4Flag
0 Ak 80.1 23.3 0 0 0 0 1 0
1 XF 0.0 0.0 0 0 1 0 0 0
2 WE 23.0 34.0 43 34 0 0 0 0
:
print (df.filter(like='Stage'))
Stage1 Stage2 Stage3 Stage4
0 80.1 23.3 0 0
1 0.0 0.0 0 0
2 23.0 34.0 43 34
print (df.filter(like='Stage').eq(0))
Stage1 Stage2 Stage3 Stage4
0 False False True True
1 True True True True
2 False False False False
print (df.filter(like='Stage').eq(0).cumsum(1))
Stage1 Stage2 Stage3 Stage4
0 0 0 1 2
1 1 2 3 4
2 0 0 0 0
print (df.filter(like='Stage').eq(0).cumsum(1).eq(1))
Stage1 Stage2 Stage3 Stage4
0 False False True False
1 True False False False
2 False False False False
<强>详情:
DriveInfo