【发布时间】:2018-06-07 15:33:18
【问题描述】:
我有一个这样的数据框:
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]})
例如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)添加到“最大值”会起作用,但必须有更好的方法...
是的!这似乎有效:
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)
【问题讨论】:
标签: pandas sorting pivot-table