Нахождение первого столбца с нулевым значением для каждой строки в Python - PullRequest
0 голосов
/ 31 мая 2018

У меня есть фрейм данных, в котором есть идентификаторы учеников и соответствующие им баллы.

Я хочу найти этап, на котором ученик был уволен, т. Е. На каком этапе появился первый нулевой балл.А затем обновите соответствующий флаг этапа = 1. Ниже приведены примеры данных:

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 изменяется на 1. Для StuID = 'XF' первый ноль появился на этапе 1, поэтому флаг S1 обновляется как 1.И уходит и в другие ряды.

1 Ответ

0 голосов
/ 31 мая 2018

Первые 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...