Python 如何根据熊猫数据帧';什么是多重索引?
我有一个熊猫数据框,如下所示Python 如何根据熊猫数据帧';什么是多重索引?,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个熊猫数据框,如下所示 data = pd.DataFrame({ 'x': [10, 9, 8, 4], 'y': [1, 2, 3, 4], }) data.index = pd.MultiIndex.from_tuples([ ('high', 'high'), ('high', 'low'), ('low', 'high'), ('low', 'low') ], names=['score', 'grade']) 我想根据2
data = pd.DataFrame({
'x': [10, 9, 8, 4],
'y': [1, 2, 3, 4],
})
data.index = pd.MultiIndex.from_tuples([
('high', 'high'),
('high', 'low'),
('low', 'high'),
('low', 'low')
], names=['score', 'grade'])
我想根据2个索引对这个数据框进行排序score
和grade
。我希望对这两个索引进行排序,使low
位于high
之前。我该怎么做
我在下面尝试了这段代码,但只有第一个索引score
按需要排序
data.sort_index(level=[0, 1], key=lambda s: sorted(s, reverse=True))
-- before/after for score
Index(['high', 'high', 'high', 'medium', 'medium', 'medium', 'low', 'low',
'low'],
dtype='object', name='score')
Index(['low', 'low', 'low', 'medium', 'medium', 'medium', 'high', 'high',
'high'],
dtype='object', name='score')
-- before/after for grade
Index(['high', 'medium', 'low', 'high', 'medium', 'low', 'high', 'medium',
'low'],
dtype='object', name='grade')
Index(['low', 'low', 'low', 'medium', 'medium', 'medium', 'high', 'high',
'high'],
dtype='object', name='grade')
关于如何根据多个索引进行自定义排序,有什么想法吗?我试图创建一个自定义排序函数进行调试。下面是我的尝试
def do_sort(s):
print(s)
r = pd.Index(sorted(s, reverse=True), name=s.name)
print(r)
return r
data.sort_index(level=[0, 1], key=do_sort)
产出结果与预期一致。这些值按照我的要求进行排序
-- before and after for score
Index(['high', 'high', 'low', 'low'], dtype='object', name='score')
Index(['low', 'low', 'high', 'high'], dtype='object', name='score')
-- before and after for grade
Index(['high', 'low', 'high', 'low'], dtype='object', name='grade')
Index(['low', 'low', 'high', 'high'], dtype='object', name='grade')
记录的输出如下所示。正如您所看到的,我得到了正确的排序(低、中、高),但是得分
索引只根据需要排序
data.sort_index(level=[0, 1], key=lambda s: sorted(s, reverse=True))
-- before/after for score
Index(['high', 'high', 'high', 'medium', 'medium', 'medium', 'low', 'low',
'low'],
dtype='object', name='score')
Index(['low', 'low', 'low', 'medium', 'medium', 'medium', 'high', 'high',
'high'],
dtype='object', name='score')
-- before/after for grade
Index(['high', 'medium', 'low', 'high', 'medium', 'low', 'high', 'medium',
'low'],
dtype='object', name='grade')
Index(['low', 'low', 'low', 'medium', 'medium', 'medium', 'high', 'high',
'high'],
dtype='object', name='grade')
--得分前/后
指数([‘高’、‘高’、‘高’、‘中’、‘中’、‘低’、‘低’,
“低”],
dtype='object',name='score')
指数([‘低’、‘低’、‘低’、‘中’、‘中’、‘中’、‘高’、‘高’,
“高”],
dtype='object',name='score')
--评分前/后
指数([‘高’、‘中’、‘低’、‘高’、‘中’、‘低’、‘高’、‘中’,
“低”],
dtype='object',name='grade')
指数([‘低’、‘低’、‘低’、‘中’、‘中’、‘中’、‘高’、‘高’,
“高”],
dtype='object',name='grade')
尝试使用
升序
out = data.sort_index(ascending=[True,False])
x y
score grade
high low 9 2
high 10 1
low low 4 4
high 8 3
#data.sort_index(ascending=[False,False])
# x y
#score grade
#low low 4 4
# high 8 3
#high low 9 2
# high 10 1
好的,你抓住我了。但实际上,虽然这是我的错,但我有3个值,“高”、“中”和“低”,这就是为什么我需要走定制的关键路线。对不起,我已经更新了示例。