If you use DataFrame.append to add the data, the dtypes are preserved, and you do not have to recast or rely on object:
In [157]: df
Out[157]:
   int   str
0    0  zero
In [159]: df.append(pd.DataFrame([[1, None]], columns=['int', 'str']), ignore_index=True)
Out[159]:
   int   str
0    0  zero
1    1  None