Вы можете создать логическую маску, затем отсортировать логическую маску, используя argsort
, и индексировать ваш окончательный массив:
A = df.isnull().values
out = df.values[np.argsort(A, axis=0, kind='mergesort'), np.arange(A.shape[1])]
array([['a', 'a', 'a'],
['b', 'b', 'b'],
['c', 'c', 'c'],
[nan, nan, nan],
[nan, nan, nan],
[nan, nan, nan],
[nan, nan, nan],
[nan, nan, nan],
[nan, nan, nan]], dtype=object)
И воссоздать DataFrame:
pd.DataFrame(out, columns=df.columns)
A B C
0 a a a
1 b b b
2 c c c
3 NaN NaN NaN
4 NaN NaN NaN
5 NaN NaN NaN
6 NaN NaN NaN
7 NaN NaN NaN
8 NaN NaN NaN