为多层索引DataFrame按EVENT_ID单独排序BSP列
解决多层索引DataFrame按组对指定列排序的问题
我明白你想要的是在保留多层索引结构的前提下,按每个EVENT_ID分组,单独对BSP列进行排序。你之前尝试的rank方法只是生成了排名值而非排序数据本身,直接单独排序又会破坏分组结构,下面给你两种可靠的解决方案:
方法一:使用sort_values(简洁高效)
直接结合分组键和目标列进行排序,既能保证每个EVENT_ID内部的BSP排序,又完整保留原有的多层索引:
# 按EVENT_ID升序排列,每个EVENT_ID内按BSP降序排序(对应你rank时的ascending=False) df_sorted = df.sort_values(['EVENT_ID', 'BSP'], ascending=[True, False])
这样处理后,每个EVENT_ID下的行会按照BSP从大到小排列,同时(EVENT_ID, SELECTION_ID)的多层索引完全保留。
方法二:使用groupby+apply(灵活扩展)
如果你需要在分组内执行更多自定义操作,这种方式更灵活,通过groupby锁定EVENT_ID层级,再对每个分组单独排序:
# 按EVENT_ID分组,每个组内按BSP降序排序,group_keys=False避免添加额外的分组索引 df_sorted = df.groupby(level='EVENT_ID', group_keys=False).apply(lambda x: x.sort_values('BSP', ascending=False))
为什么你之前的方法没生效?
你尝试的data.assign(BSP=data.groupby(level=0).rank(ascending=False))其实是将BSP列替换为该组内的排名值,而不是对数据行进行排序——行的顺序没有改变,只是BSP的值变成了排名,这和你想要的"排序"需求不符。
内容的提问来源于stack exchange,提问作者Alexander Caskie
相关产品推荐
相关产品推荐

