排序数据透视表(多索引)
Posted
技术标签:
【中文标题】排序数据透视表(多索引)【英文标题】:Sorting pivot table (multi index) 【发布时间】:2017-12-31 05:03:11 【问题描述】:在将两个“行标签”(Excel 术语)放在数据透视表上后,我试图按降序对数据透视表的值进行排序。
样本数据:
x = pd.DataFrame('col1':['a','a','b','c','c', 'a','b','c', 'a','b','c'],
'col2':[ 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3],
'col3':[ 1,.67,0.5, 2,.65, .75,2.25,2.5, .5, 2,2.75])
print(x)
col1 col2 col3
0 a 1 1.00
1 a 1 0.67
2 b 1 0.50
3 c 1 2.00
4 c 1 0.65
5 a 2 0.75
6 b 2 2.25
7 c 2 2.50
8 a 3 0.50
9 b 3 2.00
10 c 3 2.75
要创建枢轴,我使用以下函数:
pt = pd.pivot_table(x, index = ['col1', 'col2'], values = 'col3', aggfunc = np.sum)
print(pt)
col3
col1 col2
a 1 1.67
2 0.75
3 0.50
b 1 0.50
2 2.25
3 2.00
c 1 2.65
2 2.50
3 2.75
换句话说,这个变量pt
首先按col1
排序,然后在col1
中按col2
的值排序,然后在所有这些中按col3
排序。这很好,但我想按col3
(值)排序,同时保留在col2
中分解的组(此列可以是任何顺序并随机排列)。
目标输出看起来像这样(col3
以降序排列,col2
中的任意顺序带有col1
组):
col3
col1 col2
a 1 1.67
2 0.75
3 0.50
b 2 2.25
3 2.00
1 0.50
c 3 2.75
1 2.65
2 2.50
我尝试了下面的代码,但这只是对整个数据透视表值进行排序并丢失了分组(我正在寻找组内的排序)。
pt.sort_values(by = 'col3', ascending = False)
为了获得指导,这里提出(并回答)了一个类似的问题,但我无法通过提供的输出获得成功的输出:
Pandas: Sort pivot table
我从那个答案得到的错误是ValueError: all keys need to be the same shape
【问题讨论】:
【参考方案1】:DataFrame
需要 reset_index
,col1
和 col3
需要 sort_values
,MultiIndex
需要最后一个 set_index
:
df = df.reset_index()
.sort_values(['col1','col3'], ascending=[True, False])
.set_index(['col1','col2'])
print (df)
col3
col1 col2
a 1 1.67
2 0.75
3 0.50
b 2 2.25
3 2.00
1 0.50
c 3 2.75
1 2.65
2 2.50
【讨论】:
以上是关于排序数据透视表(多索引)的主要内容,如果未能解决你的问题,请参考以下文章