对2索引数据透视表进行排序:组内的值,基于值的索引

问题描述 投票:1回答:2

我有这样的数据帧:

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.个. max US solution yields:

           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)
pandas sorting pivot-table
2个回答
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

2
投票

这是一个非常类似于Wen的解决方案,它使用set_indexsort_indexreset_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
© www.soinside.com 2019 - 2024. All rights reserved.