This is an issue of pandas dtype guessing.
Pandas sees numbers and guesses you want it to be numbers.
To make pandas not doubt your intentions, you should set the dtype you want: object
pd.read_csv('filename.csv', dtype={'leading_zero_column_name': object})
Will do the trick
Update as it helps others:
To have all columns as str, one can do this (from the comment):
pd.read_csv('sample.csv', dtype = str)
To have most or selective columns as str, one can do this:
# lst of column names which needs to be string
lst_str_cols = ['prefix', 'serial']
# use dictionary comprehension to make dict of dtypes
dict_dtypes = {x : 'str' for x in lst_str_cols}
# use dict on dtypes
pd.read_csv('sample.csv', dtype=dict_dtypes)