如何根据列值差异程度重排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
实现方法
核心思路是通过每列的唯一值数量衡量差异程度,再据此对列名排序:
- 计算每列的唯一值数量,生成列名与唯一值数的映射
- 按唯一值数量升序对列名排序(数量越少,差异越小,越靠前)
- 使用排序后的列名重新索引已排序的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
相关产品推荐
相关产品推荐

