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

如何按列值总和对Pandas交叉表(crosstab)的列排序

按列总和排序Pandas交叉表的列

解决步骤

直接通过计算列总和、生成排序后的列名列表,再重新选取交叉表的列即可完成需求,具体操作如下:

  1. 计算列总和并排序得到列名顺序
    先计算交叉表每列的总和,然后对总和降序排序,提取对应的列名:

    # 计算列总和并降序排序,得到排序后的列名索引
    sorted_columns = ct.sum().sort_values(ascending=False).index
    
  2. 用排序后的列名重新索引交叉表
    用上面得到的列名列表重新选取交叉表的列,就得到按列总和排序后的结果:

    ct_sorted = ct[sorted_columns]
    

完整示例验证

用你提供的示例数据测试:

import pandas as pd
import numpy as np

# 模拟匹配交叉表数据的原始数据集
data = {
    'experience': [0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3],
    'region': ['a','c','d','e','a','b','d','e','a','b','d','e','a','b','d','e']
}
# 按交叉表数值重复对应行
df_flt_reg = pd.DataFrame(data)
df_flt_reg = pd.concat([df_flt_reg]*np.array([1,7,3,6,2,4,5,4,3,5,7,2,1,3,9,1]))

# 生成交叉表
ct = pd.crosstab(df_flt_reg['experience'], df_flt_reg['region'])

# 执行列排序
sorted_columns = ct.sum().sort_values(ascending=False).index
ct_sorted = ct[sorted_columns]

print(ct_sorted)

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

d   e   b  c  a
experience                 
0           3   6   0  7  1
1           5   4   4  1  2
2           7   2   5  0  3
3           9   1   3  1  1

关于你之前尝试的问题说明

你用crosstab.sort_values(by=...)无效,是因为sort_values()的by参数是指定按哪些行的值来排序行,而非排序列。要调整列的顺序,必须先拿到列的排序规则,再重新选取列。

如果需要添加总和行(可选操作),可以这样实现:

# 给排序后的交叉表添加sum行
ct_sorted.loc['sum'] = ct_sorted.sum()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:31:02