Run:
df.apply(lambda col: col.dropna().reset_index(drop=True).astype(int))
Just apply to each column a function, which drops NaN values in this column.
Due to presence of NaN values column are generally of float type,
but I attempt to cast them to int.
Note also that other solutions work only as long as each column contains
equal number of non-NaN values.
To check it, add the following row:
6 NaN NaN 999
to your 6 initial rows, so that now Column3 contains 3 non-Nan values,
whereas other columns - only 2.
Solution by yatu drops this last row, whereas solution by Quang
results in ValueError: arrays must all be same length.
But my solution works OK also in this case, leaving trailing NaN
in "too short" columns.