使用Pandas 0.20.2和Python 3.6.1:
使用列表索引单级DataFrame时,返回的DataFrame会遵循列表的顺序,例如考虑此DataFrame:
df = pd.DataFrame({'col1': [0,1,2],
'col2': ['foo', 'bar', 'baz']},
index=list('ABD'))
当使用不同顺序的列表作为索引编制索引时,返回:
df.loc[['D','B'],:]
当我使用多索引DataFrame时,我想要有这种行为。但是,如果我将其中一列添加到索引并再次索引,则顺序与原始DataFrame类似,而不是用于索引的列表:
df = df.set_index('col2', append=True)
df.loc[['D','B'],:]
由于关卡包含字符串,因此在索引之前对DataFrame进行排序并不那么简单。解决方法可能是将索引转换为Categorical,其中类别根据我的首选顺序进行映射,然后正常排序可以工作。但这似乎真的很牵强,特别是如果你想要不同的订单'每时每刻。
@ EdChum的回答适用于我发布的2级示例,但没有3级,所以需要谨慎!
考虑这个DataFrame:
df = pd.DataFrame({'col1': ['foo', 'bar', 'baz'],
'col2': ['green', 'blue', 'red'],
'col3': [0,1,2], },
index=list('ABD'))
df.index.names = ['col0']
df = df.set_index(['col1','col2'], append=True)
df.reindex(index=['baz', 'bar'], level='col1')
尝试@ piRSquared对3级索引的回答,如果你的排序与索引的级别相同,那么它似乎是一个解决方案。
df = df.sort_index(level='col1')
df.iloc[df.index.get_level_values('col1').searchsorted(['baz', 'bar'])]
答案 0 :(得分:2)
你可以使用reindex
按照你想要的顺序强制行的顺序,似乎使用loc
它不可能用多索引来做这个,因为排序是始终强制执行:
In[13]:
df.reindex(['D','B'], level=0)
Out[13]:
col1
col2
D baz 2
B bar 1
答案 1 :(得分:0)
假设索引已经排序。
df1 = df.set_index('col2', append=True)
df1.iloc[df1.index.get_level_values(0).searchsorted(['D', 'B'])]
col1
col2
D baz 2
B bar 1
但是@ EdChum的答案远远优于