Я думаю, нужно вычесть 3
(последний), потому что ссылочный столбец с именем столбца последней 2
:
df1.columns = df1.columns.astype(int)
print((df1.columns.max() - df1.eq(2).iloc[:,::-1].idxmax(axis=1)).mask(lambda x: x == 0))
0 NaN
1 1.0
2 NaN
3 NaN
dtype: float64
Подробности :
Сравнить по2
:
print (df1.eq(2))
1 2 3
0 False False False
1 True True False
2 False False False
3 False False False
Обратный порядок столбцов:
print (df1.eq(2).iloc[:,::-1])
3 2 1
0 False False False
1 False True True
2 False False False
3 False False False
Проверить имя столбца первого True
(поскольку обратные столбцы являются последними)
print (df1.eq(2).iloc[:,::-1].idxmax(axis=1))
0 3
1 2
2 3
3 3
dtype: int64
Вычитать по максимальному значению, но также возвращает 0
, если значение в контрольном столбце и если не совпадают значения:
print (df1.columns.max() - df1.eq(2).iloc[:,::-1].idxmax(1))
0 0
1 1
2 0
3 0
dtype: int64