Python-Pandas如何对透视表排序并保持单列分组结构
多层索引透视表分组内排序实现
问题复现
构造测试DataFrame并生成初始透视表的代码如下:
import pandas as pd import numpy as np df = pd.DataFrame({'Year': ['2012','2012','2012','2012','2012','2012','2012','2012','2012','2013', '2013','2013','2013','2013','2013','2013','2013','2013','2013'], 'Product':['X','X','X','Y','Z','W','X','X','X','Y','Z','W','Z','Z','W','Y','X','Z', 'Y'], 'Country':['A','B','C','D','A','B','C','D','A','B','C','D','A','B','C','D','A','B', 'A'], 'Units':[44,55,42,57,95,54,27,55,81,54,65,23,89,76,34,12,1,67,8], }) # 按Country、Product分组生成透视表 myPivot1 = pd.pivot_table(df, values = ['Units'], index=['Country', 'Product'], aggfunc=np.sum) print(myPivot1)
排序需求
保持Country的分组结构不被打乱,每个国家分组内部按照Units字段数值降序排列,预期输出如下:
Units Country Product A Z 184 X 126 Y 8 B Z 143 X 55 W 54 Y 54 C X 69 Z 65 W 34 D Y 69 X 55 W 23
错误尝试
直接对Units字段做全局排序会打破Country的分组结构,代码和错误输出如下:
myPivot2 = myPivot1.sort_values(('Units'), ascending=False) print(myPivot2)
Units Country Product A Z 184 B Z 143 A X 126 C X 69 D Y 69 C Z 65 B X 55 D X 55 B W 54 Y 54 C W 34 D W 23 A Y 8
解决方案
针对多层索引的分组内排序需求,按第一层索引(即Country)分组,再在每个分组内部单独按Units降序排序即可,不会打乱原有Country的分组顺序:
myPivot2 = myPivot1.groupby(level=0, group_keys=False).apply( lambda group: group.sort_values('Units', ascending=False) ) print(myPivot2)
运行代码后输出和预期结果完全一致。
注:
group_keys=False参数用于避免分组后额外叠加一层索引,保持和原透视表一致的双层索引结构。
内容的提问来源于stack exchange,提问作者Hookstark
相关产品推荐
相关产品推荐

