我有以下数据框:
df = pd.DataFrame(
{
'a':[1,2,3,4,5,6],
'b':[1,1,3,3,5,5],
'c':[1,2,3,4,5,6],
'd':[1,1,1,1,1,5],
}
)
In [1051]: df
Out[1051]:
a b c d
0 1 1 1 1
1 2 1 2 1
2 3 3 3 1
3 4 3 4 1
4 5 5 5 1
5 6 5 6 5
如果我使用所有列对 df 进行排序,我会得到以下结果:
In [1055]: columns = list(df.columns)
...:
...: dfSorted = df.sort_values(by=columns, ascending=False)
...:
...: print(dfSorted)
a b c d
5 6 5 6 5
4 5 5 5 1
3 4 3 4 1
2 3 3 3 1
1 2 1 2 1
0 1 1 1 1
我想重新排列列的顺序,从行之间差异最小的列开始,最后一列是差异最大的一列。在我的示例中,预期顺序应该是 d,b,c,a。
之所以如此,是因为列
d
只有两个不同的值(1 和 5),而列 c
和 a
的所有值都不同。 b
栏是中间的情况...
In [1056]: dfSorted[['d','b','c','a']]
Out[1056]:
d b c a
5 5 5 6 6
4 1 5 5 5
3 1 3 4 4
2 1 3 3 3
1 1 1 2 2
0 1 1 1 1
有什么想法吗?谢谢!
一个可能的解决方案是按
sort_values
值的数量 nunique
列,并将其用于 reindex
:
df = df.reindex(df.nunique().sort_values().index, axis=1)
d b a c
5 5 5 6 6
4 1 5 5 5
3 1 3 4 4
2 1 3 3 3
1 1 1 2 2
0 1 1 1 1