使用列表

时间:2017-06-08 07:48:16

标签: python pandas

使用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'))

enter image description here

当使用不同顺序的列表作为索引编制索引时,返回:

df.loc[['D','B'],:]

enter image description here

当我使用多索引DataFrame时,我想要有这种行为。但是,如果我将其中一列添加到索引并再次索引,则顺序与原始DataFrame类似,而不是用于索引的列表:

df = df.set_index('col2', append=True)
df.loc[['D','B'],:]

enter image description here

由于关卡包含字符串,因此在索引之前对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)

enter image description here

df.reindex(index=['baz', 'bar'], level='col1')

enter image description here

EDIT2:

尝试@ piRSquared对3级索引的回答,如果你的排序与索引的级别相同,那么它似乎是一个解决方案。

df = df.sort_index(level='col1')
df.iloc[df.index.get_level_values('col1').searchsorted(['baz', 'bar'])]

enter image description here

2 个答案:

答案 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的答案远远优于