Преобразовать в float (игнорируя ошибки), а затем преобразовать результат в int.
df['id'] = df['id'].astype(float, errors='ignore').astype(int)
Альтернативно:
df['id'] = df['id'].replace(np.nan,0)
И затем используйте регулярное выражение:
df['id'] = df['id'].astype(int)
В случае чисел, первоначально отформатированных как строки (например, «35» вместо 35), помогает следующее:
df['id'] = df['id'].apply(lambda x: int(x))