Вы можете попробовать это, чтобы увидеть, работает ли это.
import pandas as pd
import numpy as np
Начальные данные
df = pd.DataFrame({'col1':[1,0,np.NaN,np.NaN,1],'col2':[1,0,np.NaN,np.NaN,1],'col3':[1,0,np.NaN,np.NaN,1]})
Сначала сделайте копию оригинального df.
df_copy = df.copy()
Затем замените значения в копии на основе вышеуказанных критериев.
columns = df_copy.columns
df_copy[columns] = np.where(df_copy[columns]==0,-1,df_copy[columns])
Затем заполните пустые значения 0.
df_copy = df_copy.fillna(0)
Добавьте количество столбцов для сортировки.
df.loc['total'] = np.arange(len(df.columns))
df_copy.loc['total'] = np.arange(len(df_copy.columns))
Затем объедините два df вместе
new_df = pd.concat([df,df_copy],axis=1)
Отсортируйте столбцы, используя строку количества столбцов, затем удалите строку из нового df
new_df = new_df.sort_values(by='total',axis=1)
new_df = new_df.loc[~new_df.index.isin(['total'])]