Первые filter
только 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
по mask
:
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