我有一个这样的数据框:
x = pd.DataFrame({'col1':['bul', 'eng','eng', 'ger','ger', 'fra','fra'],
'col2':['fra', 'ger','fra', 'fra','eng', 'ger','eng'],
'col3':[ 1, 4, 2, 6, 7, 20, 5]})
pt = pd.pivot_table(x, index = ['col1', 'col2'], values = 'col3', aggfunc = np.sum)
pt
col3
col1 col2
bul fra 1
eng fra 2
ger 4
fra eng 5
ger 20
ger eng 7
fra 6
我想排序到达:
col3
col1 col2
fra ger 20
eng 5
ger eng 7
fra 6
eng ger 4
fra 2
bul fra 1
第三列按降序排列(在col1单元格内)并且col1基于col3的属性排序,这里max(20> 7> 4> 1)
有几个问题涉及类似问题,我的相关问题是因为它具有描述性标题和样本数据(还有其他问题答案对我不起作用)
https://stackoverflow.com/a/45300480/3014199建议
df = pt.reset_index()
.sort_values(['col1','col3'], ascending=[True, False])
.set_index(['col1','col2'])
print(df)
col3
col1 col2
bul fra 1
eng fra 2
ger 4
fra eng 5
ger fra 6
eng 7
fra ger 20
对于dataFrame来说,似乎对col3进行了排序,但对我的数据似乎并不起作用。
Pandas: Sort pivot table似乎也很有希望,但与其他人一样,我得到ValueError: all keys need to be the same shape
更新
我的例子不够通用,对不起!如果2个组共享相同的最大值,它也应该有效,例如
x2 = pd.DataFrame({'col1':['bul', 'eng','eng', 'ger','ger', 'fra','fra'],
'col2':['fra', 'ger','fra', 'fra','eng', 'ger','eng'],
'col3':[ 1, 7, 2, 6, 7, 20, 5]})
E.g。 MaxU的解决方案产生:
col3
col1 col2
fra ger 20
eng 5
ger eng 7
eng ger 7
ger fra 6
eng fra 2
bul fra 1
我敢打赌将col1的哈希(或者更确切地说是分组数字除以10)添加到' max'会工作,但必须有一个更好的方式...
是!这似乎有效:
pt['New']=pt.groupby(level='col1').col3.transform('max')
pt['New'] = 1/(pt.index.labels[0]+1)+pt['New'].values
pt=pt.sort_values(['New','col3'],ascending=False).drop('New',1)
答案 0 :(得分:3)
我们可以使用新的para来实现这个目标
pt['New']=pt.groupby(level='col1').col3.transform('max')
pt=pt.sort_values(['New','col3'],ascending=False).drop('New',1)
pt
Out[1445]:
col3
col1 col2
fra ger 20
eng 5
ger eng 7
fra 6
eng ger 4
fra 2
bul fra 1
更新:
pt['New']=pt.groupby(level='col1').col3.transform('max')
pt['New1']=pt.groupby(level='col1').col3.ngroup()
pt=pt.sort_values(['New','New1','col3'],ascending=False)
pt
Out[151]:
col3 New New1
col1 col2
fra ger 20 20 2
eng 5 20 2
ger eng 7 7 3
fra 6 7 3
eng ger 7 7 1
fra 2 7 1
bul fra 1 1 0
答案 1 :(得分:2)
这是一个非常类似于Wen的解决方案,它使用set_index
,sort_index
和reset_index
:
In [188]: (pt.set_index([pt.groupby(level='col1').col3.transform('max'), pt['col3']], append=True)
...: .sort_index(level=[2,3], ascending=False)
...: .reset_index(level=[2,3], drop=True)
...: )
...:
Out[188]:
col3
col1 col2
fra ger 20
eng 5
ger eng 7
fra 6
eng ger 4
fra 2
bul fra 1