Вот смесь функционального и пандастического подхода:
df = pd.DataFrame({'w1': [0, 1,1,0],
'w2': [1, 1,0,1],
'w3': [1, 1,0,0],
'w4': [0, 1,0,1]})
df
w1 w2 w3 w4
0 0 1 1 0
1 1 1 1 1
2 1 0 0 0
3 0 1 0 1
def choose_one(row):
"""
returns array with randomly chosen positive value and 0 otherwise
"""
one = np.random.choice([i for i, v in enumerate(row) if v])
return [0 if i != one else 1 for i in range(len(row))]
применяется для каждого ряда
df.apply(choose_one, 1)
w1 w2 w3 w4
0 0 1 0 0
1 0 1 0 0
2 1 0 0 0
3 0 0 0 1