python - 对数据框多索引级别和按列进行排序
问题描述
更新:pandas 0.23.0 版解决了这个问题
我一直在努力解决这个问题,我怀疑有更好的方法。如何按索引级别名称“idx_0”、级别 = 0 和列“value_1”降序对以下数据帧进行排序,以使“MyName”列读取垂直“SCOTTBOSTON”。
import pandas as pd
import numpy as np
df = pd.DataFrame({'idx_0':[2]*6+[1]*5,
'idx_1':[6,4,2,10,18,5,11,1,7,9,3],
'value_1':np.arange(11,0,-1),
'MyName':list('BOSTONSCOTT')})
df = df.set_index(['idx_0','idx_1'])
df
输出:
MyName value_1
idx_0 idx_1
2 6 B 11
4 O 10
2 S 9
10 T 8
18 O 7
5 N 6
1 11 S 5
1 C 4
7 O 3
9 T 2
3 T 1
例外输出使用:
df.sort_values(['value_1'], ascending=False)\
.reindex(sorted(df.index.get_level_values(0).unique()), level=0)
我怀疑有一种更简单的方法无需重置索引
MyName value_1
idx_0 idx_1
1 11 S 5
1 C 4
7 O 3
9 T 2
3 T 1
2 6 B 11
4 O 10
2 S 9
10 T 8
18 O 7
5 N 6
失败#1:
df.sort_values('value_1', ascending=False).sort_index(level=0)
首先按值排序,然后排序索引级别 = 0,但级别 = 1 也被排序。
MyName value_1
idx_0 idx_1
1 1 C 4
3 T 1
7 O 3
9 T 2
11 S 5
2 2 S 9
4 O 10
5 N 6
6 B 11
10 T 8
18 O 7
失败#2
df.sort_index(level=0).sort_values('value_1', ascending=False)
按索引级别 = 0 排序,然后按值排序,但索引 = 0 再次变得混乱。
MyName value_1
idx_0 idx_1
2 6 B 11
4 O 10
2 S 9
10 T 8
18 O 7
5 N 6
1 11 S 5
1 C 4
7 O 3
9 T 2
3 T 1
解决方案
以下是满足您需求的一些潜在解决方案:
方法一:
(df.sort_values('value_1', ascending=False)
.sort_index(level=[0], ascending=[True]))
方法二:
(df.set_index('value_1', append=True)
.sort_index(level=[0,2], ascending=[True,False])
.reset_index('value_1'))
在 pandas 0.22.0、Python 3.6.4 上测试
推荐阅读
- c# - C#:使用 Python.Runtime 未找到
- sdl - SDL 分层渲染系统
- python - DJango 查询集过滤器具有不同模型的外键
- eslint - 什么可能导致 eslint-plugin-prettier 在 CircleCI 上报告错误但在本地保持沉默?
- javascript - 如何使用 node.js 或 Angular 获取 mac 地址和 ip 地址
- java - 将 jedis .jar 文件上传到 Git 存储库
- linux - SSH 进入 DC 的时钟服务器后,如何在我的脚本中触发脚本?
- ruby-on-rails - 在您的应用程序中检测到安全漏洞
- gimp - 移除双 Alpha 通道
- javascript - 成功的ajax调用后删除点击范围