You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据列值差异程度重排Pandas DataFrame的列顺序?

Pandas按列值差异程度重排列顺序

问题背景

现有如下Pandas DataFrame:

import pandas as pd

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],
    }
)

输出结果:

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

先将DataFrame按所有列降序排序:

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列仅2个不同值,b列3个,a、c列6个),期望得到列顺序为d,b,c,a的结果:

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

实现方法

核心思路是通过每列的唯一值数量衡量差异程度,再据此对列名排序:

  1. 计算每列的唯一值数量,生成列名与唯一值数的映射
  2. 按唯一值数量升序对列名排序(数量越少,差异越小,越靠前)
  3. 使用排序后的列名重新索引已排序的DataFrame

代码实现

# 计算每列的唯一值数量
unique_counts = dfSorted.nunique()

# 按唯一值数量升序排序列名,得到目标列顺序
sorted_columns = unique_counts.sort_values().index.tolist()

# 重新排列DataFrame的列
result = dfSorted[sorted_columns]
print(result)

运行后输出结果与期望一致:

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

补充说明

  • 如果存在唯一值数量相同的列(如示例中的a和c列),会保持它们在原DataFrame中的相对顺序;若需要自定义这部分的排序规则,可以在sort_values()中添加额外的排序条件。
  • 也可以直接用df.nunique()计算原始DataFrame的列唯一值数量,因为排序操作不会改变列的唯一值数量,结果一致。

内容的提问来源于stack exchange,提问作者Lucas Aimaretto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 00:22:06