Python 对数据帧的行和列进行排序

Python 对数据帧的行和列进行排序,python,pandas,Python,Pandas,我有一个pd Dataframe,它的元素是0或1,每行和每列都有一个标签。 例如: import pandas as pd import numpy as np N = 100 M = 200 p = 0.8 df = pd.DataFrame(np.random.choice([0,1], (M,N), p=(p, 1-p)), columns=sorted((list(range(10))*N)[0:N]), ind

我有一个pd Dataframe,它的元素是0或1,每行和每列都有一个标签。 例如:

import pandas as pd
import numpy as np

N = 100
M = 200
p = 0.8
df = pd.DataFrame(np.random.choice([0,1], (M,N), p=(p, 1-p)),
                  columns=sorted((list(range(10))*N)[0:N]),
                  index=sorted((list(range(10))*N)[0:M]))
我想做的是根据每个块(每个标签定义一个块)的元素的程度(行和列总和)进行排序

其思想是使用每个块的行和列的总和。 例如,对于第一个块:

df.loc['0', '0'].sum(axis=0)
df.loc['0', '0'].sum(axis=1)
并使用这些值对标签为0的所有行和列进行排序

想象一下:

   0 0 0 1 1 1

0  1 1 1 0 0 1
0  0 0 1 0 0 0
0  1 1 0 0 0 1
1  0 0 0 1 0 0
1  0 0 0 1 1 0
1  0 0 0 1 1 1
所需输出为:

   0 0 0 1 1 1

0  1 1 1 0 0 1
0  1 1 0 0 0 1
0  1 0 0 0 0 0
1  0 0 0 1 1 1
1  0 0 0 1 1 0
1  0 0 0 1 0 0

重要的是每个块中元素的总和,而不是所有行或整个列的总和。

以下是可能导致更一般解决方案的起点:

import pandas as pd
import numpy as np

d=  """1 1 1 0 0 1
0 0 1 0 0 0
1 1 0 0 0 1
0 0 0 1 0 0
0 0 0 1 1 0
0 0 0 1 1 1"""
    
a = d.split('\n')
a = [r.split(' ') for r in a]

df = pd.DataFrame({column : [int(a[row][column]) for row in range(6)] for column in range(6)})
   
print(df)
print('-' * 10)

df['rsum'] = df.sum(axis=1)
df['row'] = [0,0,0,1,1,1]
df.sort_values(by=['row', 'rsum'], ascending = [True, False], inplace=True)
df.drop(['rsum', 'row'], axis=1, inplace=True)

print(df)
print('-' * 10)
df = df.transpose()
df.reset_index(drop=True, inplace=True)

df['rsum'] = df.sum(axis=1)
df['row'] = [0,0,0,1,1,1]
df.sort_values(by=['row', 'rsum'], ascending = [True, False], inplace=True)
df.drop(['rsum', 'row'], axis=1, inplace=True)

df = df.transpose()
print(df.values)