df2 = pd.DataFrame(-np.ones(df.shape))
for row, col in enumerate(np.argmax(df.values, axis=1)):
    df2.iat[row, col] = df.iat[row, col]
Pandas: векторизованные операции с максимальными значениями в строке