如何在Pandas中分组排序时避免新增索引层级?
解决MultiIndex表格分组排序不新增索引的问题
你的原始MultiIndex表格如下:
Lang C++ java python All Corp Name ASW ASW 0.0 0.0 5.0 5 Facebook Facebook 8.0 1.0 5.0 14 Google Google 2.0 24.0 1.0 27 ASW Cristiano NaN NaN 5.0 5 Facebook Cristiano NaN NaN 3.0 3 Michael NaN 1.0 2.0 3 Piter 8.0 NaN NaN 8 Google Cristiano NaN NaN 1.0 1 Michael NaN 24.0 NaN 24 Piter 2.0 NaN NaN 2
你原本使用的代码:
out = df.groupby(level=0).apply(lambda g: g.sort_values('All', ascending=False))
会新增一层索引,原因是groupby.apply拼接分组结果时,会自动把分组键(这里是Corp)作为最外层索引层级添加,导致索引结构变复杂。
以下两种方法可以在不新增索引的前提下实现每个Corp组内按All列降序排序:
方法一:直接使用sort_values指定分组+排序规则
不需要用groupby,直接通过sort_values同时指定分组键和排序列,就能实现组内排序:
out = df.sort_values(by=['Corp', 'All'], ascending=[True, False])
by=['Corp', 'All']:先按Corp分组(保证同公司的行在一起),再按All列排序ascending=[True, False]:Corp保持升序排列,All列按降序排列
方法二:结合groupby.argsort与loc重排
通过groupby获取每个组内的排序索引位置,再用loc重新排列整个表格:
out = df.loc[df.groupby(level=0)['All'].argsort(ascending=False).values]
df.groupby(level=0)['All'].argsort(ascending=False):返回每个Corp组内,All列降序对应的行索引位置.values提取索引数组后,用loc直接重排原表格,保持原有MultiIndex结构不变
内容的提问来源于stack exchange,提问作者Abradab3
相关产品推荐
相关产品推荐

