Pandas v0.24+
See NumPy or Pandas: Keeping array type as integer while having a NaN value
Pandas pre-v0.24
You cannot have NaN values in an int dtype series. This is non-avoidable, because NaN values are considered float:
import numpy as np
type(np.nan)  # float
Your best bet is to read in these columns as float instead. If you are then able to replace NaN values by a filler value such as 0 or -1, you can process accordingly and convert to int:
int_cols = ['col1', 'col2', 'col3']
df[int_cols] = df[int_cols].fillna(-1)
df[int_cols] = df[int_cols].apply(pd.to_numeric, downcast='integer')
The alternative of having mixed int and float values will result in a series of dtype object. It is not recommended.