This piece of code speaks for itself.
import pandas as pd
import numpy as np
np.random.seed(1)
# Python 2.7.12
# I am up to date on either pandas, and numpy versions.
print pd.__version__ # 0.23.0
print np.__version__ # 1.14.3
arr = np.random.randint(1, 16, 10).reshape(2, 5)
print arr
"""
[[ 6 12 13 9 10]
[12 6 1 1 2]]
"""
df = pd.DataFrame(arr)
print df
print 'df[4].dtypes = {}'.format(df[4].dtypes)
"""
0 1 2 3 4
0 6 12 13 9 10
1 12 6 1 1 2
df[4].dtypes = int32
"""
df.iloc[1, 4] = np.nan
print 'df[4].dtypes = {}'.format(df[4].dtypes)
# df[4].dtypes = float64
Why is this happening ?