python - 在对第一个 pandas python 进行排序时保持第二级多索引完整
问题描述
我使用以下方法对我的第一级索引进行了排序:groupby pandas python 的自定义排序顺序函数
def my_func(group):
return sum(group["B"]*group["C"])
idx=df.groupby('A').apply(my_func).reindex(df.index.get_level_values(0))
df.iloc[idx.argsort()]
问题是第二级排序在第一级排序后混乱了。如何确保保持集团内订单?
从
A B C
1 0 1 8
1 3 3
2 0 1 2
1 2 2
3 0 1 3
1 2 4
到
A B C
2 0 1 2
1 2 2
3 0 1 3
1 2 4
1 0 1 8
1 3 3
而不是(最后两行倒置)
A B C
2 0 1 2
1 2 2
3 0 1 3
1 2 4
1 1 3 3
0 1 8
解决方案
我认为您需要稳定的排序算法- mergesort
:
idx=df.index.get_level_values(0).map(df.groupby('A').apply(my_func))
df = df.iloc[idx.argsort(kind='mergesort')]
print (df)
B C
A
2 0 1 2
1 2 2
3 0 1 3
1 2 4
1 0 1 8
1 3 3
推荐阅读
- express - Sendgrid Next.js - React.js 和 Express.js - 获取数据的问题
- java - JxBrowser Java,Gradle 问题
- client-server - 关于“向后/向前兼容性”的语义
- javascript - 如果在函数中也修改了状态,则去抖动不起作用
- typescript - 从长字符串 Typescript 中删除特定字符
- python - 在单个单元格而不是单独的单元格中打印多个值
- python - 在python中按两个值排序。一升一降
- angular - 为什么每次到达 Angular 延迟加载模块下的页面时都会初始化 NgRx 存储?
- sql - 计算平衡体积的窗口函数
- symfony - 无法使用多个提供商和防火墙注销 Symfony 5