Why is my model accuracy high in train-test split but actually worse than chance in validation set?
Looking at your code, one set of data transformations were applied to the train data and a different set of transformations were applied to the test data. Different data transformations could account for different evaluation metric performance. 

It is best practices to put all data transformations in a function so they can be applied to all data in a similar way. 

Since you are using scikit-learn, sklearn.compose.ColumnTransformer is designed for this purpose. Example code for the Titanic dataset is here.