根据排序输出重新排列数据框中的列

问题描述 投票:0回答:1

我有以下数据框:

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

有什么想法吗?谢谢!

python pandas sorting
1个回答
0
投票

一个可能的解决方案是按

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
© www.soinside.com 2019 - 2024. All rights reserved.