Вы можете обобщить это так, чтобы последний индекс 1
на строку оставался 1
, а все остальное оставлялось как 0
. Для повышения производительности работайте с базовым массивом numpy
:
a = df.values
idx = (a.shape[1] - a[:, ::-1].argmax(1)) - 1
t = np.zeros(a.shape)
t[np.arange(a.shape[0]), idx] = 1
array([[0., 0., 1.],
[0., 1., 0.],
[0., 0., 1.]])
Если вам нужен результат как DataFrame:
pd.DataFrame(t, columns=df.columns, index=df.index).astype(int)
X Y Z
0 0 0 1
1 0 1 0
2 0 0 1