Если я правильно понимаю, самый краткий способ достижения вашего результата, который я могу придумать, заключается в следующем:
df2 = pd.DataFrame(df1.loc[:, 'Name1_x':].values.reshape(-1, 2), columns=['Name', 'Y']).drop_duplicates()
Это производит
Name Y
0 Jack 0
1 John 1
2 Sarah 0
5 Eva 1
7 Tom 0
, который вы можете отсортировать с помощью
df2 = df2.sort_values(by=['Y', 'Name'], ascending=[False, True]).reset_index(drop=True)
так, что конечный результат будет
Name Y
0 Eva 1
1 John 1
2 Jack 0
3 Sarah 0
4 Tom 0
(я не знаю, почему Джек появляется последним в вашем ожидаемом результате, я предполагаю опечатку или что это не имеет значения.)