如何在不改变分组的情况下对数据帧进行排序?

2024-09-28 17:28:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用熊猫做一个分组,并应用排序。如下所示: 1到目前为止,我已经创建了各个帧来获取小计。不知道如何继续之后,得到正确的排序没有诉诸黑客

示例数据帧来自上一个问题this

df = pd.DataFrame({
'admin0': ['cntry1', 'cntry1', 'cntry1', 'cntry1', 'cntry1', 'cntry1', 'cntry2', 'cntry2', 'cntry2', 'cntry2', 'cntry2'], 
'admin1': ['state1', 'state1', 'state1', 'state2', 'state2', 'state2', 'state3', 'state3', 'state3', 'state3', 'state4'], 
'admin2': ['city1', 'city1', 'city2', 'city3', 'city4', 'city4', 'city5', 'city6', 'city6', 'city6', 'city7'], 
'windspeed': [60, 90, 60, 60, 60, 90, 60, 60, 90, 120, 60], 
'population': [700, 210, 100, 70, 180, 370, 890, 120, 420, 360, 740]
})
g1 = df.groupby(['admin0', 'admin1',  'admin2']).sum()
g2 = g1.groupby(level=[0, 1]).sum()
g2.index = pd.MultiIndex.from_arrays([g2.index.get_level_values(0), g2.index.get_level_values(1), len(g2.index)*['']])
g3 = g1.groupby(level=0).sum()
g3.index = pd.MultiIndex.from_arrays([g3.index.get_level_values(0), len(g3.index)*[''], len(g3.index)*['']])
g = pd.concat([g1, g2, g3])

g国现在:

                         windspeed  population
admin0 admin1 admin2                       
cntry1 state1 city1         150         910
              city2          60         100
       state2 city3          60          70
              city4         150         550
cntry2 state3 city5          60         890
              city6         270         900
       state4 city7          60         740
cntry1 state1               210        1010
       state2               210         620
cntry2 state3               330        1790
       state4                60         740
cntry1                      420        1630
cntry2                      390        2530

我现在希望能够在不改变分组的情况下进行排序,如gif所示

按风速上升分组时的预期响应:

                      windspeed  population
admin0 admin1 admin2
cntry2                      390        2530
       state4                60         740
              city7          60         740
       state3               330        1790
              city5          60         890
              city6         270         900
cntry1                      420        1630
       state1               210        1010
              city2          60         100
              city1         150         910
       state2               210         620
              city3          60          70
              city4         150         550

Tags: indexlevelpdg2admin2state1admin1g3
3条回答

您需要在排序中包括前3列

g1.sort_values(by=['admin0', 'admin1',  'admin2','windspeed','population'], ascending = False)

使用排序索引(级别=0)

                      windspeed  population
admin0 admin1 admin2                       
cntry1                      420        1630
       state1               210        1010
              city1         150         910
              city2          60         100
       state2               210         620
              city3          60          70
              city4         150         550
cntry2                      390        2530
       state3               330        1790
              city5          60         890
              city6         270         900
       state4                60         740
              city7          60         740

从数据帧g继续按'windspeed'升序排序的示例:

levels = ['admin0', 'admin1',  'admin2']
g.groupby(levels[:-1], group_keys = False).apply(lambda x: x.sort_values(by = 'windspeed', ascending=True))

基本上,您需要像以前一样执行groupby,然后在除最后一个级别之外的所有级别上再次执行groupby,并按所需列应用排序

相关问题 更多 >