This is a "gotcha" in pandas (Support for integer NA), where integer columns with NaNs are converted to floats.
This trade-off is made largely for memory and performance reasons, and also so that the resulting Series continues to be “numeric”. One possibility is to use dtype=object arrays instead.