python-对大 pandas MultiIndex排序

我通过使用另一个 dataframe 创建了一个具有MultiIndex的 dataframe :

arrays = [df['bus_uid'], df['bus_type'], df['type'],
          df['obj_uid'], df['datetime']]
tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=['bus_uid', 'bus_type', 'type',
                                                 'obj_uid', 'datetime'])
multindex_df = pd.DataFrame(df['val'].values, index=index)

如文档http://pandas.pydata.org/pandas-docs/stable/advanced.html所述,此方法运行良好.

在文档中,该文档还说,在“需要使用MultiIndex进行排序”下,需要对标签进行排序以正确进行索引和切片功能.

但是不知何故

multindexed_df.sort_index(level=0)

要么

multindexed_df.sort_index(level='bus_uid')

不再起作用,并引发TypeError:sort_index()得到了意外的关键字参数’level’.

在sort_index()上查找对象信息,看起来“ by”是我的新朋友,而不是“ levels”:

by:object
  Column name(s) in frame. Accepts a column name or a list for a nested sort. A tuple will be interpreted as the levels of a multi-index.

我的问题如下:如何对MultiIndex进行排序,以便所有功能(切片等)都能正常工作?

最佳答案

答案取决于您使用的 pandas 版本.对于最新的 pandas (> = 0.17.0),您确实可以使用level关键字来指定对多级索引进行排序:

df = df.sort_index(level=0)

但是,如果您的 pandas 较旧(<0.17.0),则此level关键字尚不可用,但是您可以使用sortlevel方法:

df = df.sortlevel(level=0)

但是请注意,如果要对所有级别进行排序,则无需指定level关键字,您可以执行以下操作:

df = df.sort_index()

这将适用于最新版本和较旧版本的 pandas .

有关排序API中这些更改的摘要,请参见http://pandas.pydata.org/pandas-docs/stable/whatsnew.html#changes-to-sorting-api