如何按列值总和对Pandas交叉表(crosstab)的列排序
按列总和排序Pandas交叉表的列
解决步骤
直接通过计算列总和、生成排序后的列名列表,再重新选取交叉表的列即可完成需求,具体操作如下:
计算列总和并排序得到列名顺序
先计算交叉表每列的总和,然后对总和降序排序,提取对应的列名:# 计算列总和并降序排序,得到排序后的列名索引 sorted_columns = ct.sum().sort_values(ascending=False).index用排序后的列名重新索引交叉表
用上面得到的列名列表重新选取交叉表的列,就得到按列总和排序后的结果: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
相关产品推荐
相关产品推荐

