排序pandas MultiIndex

时间:2016-01-04 11:51:04

标签: python pandas

我使用另一个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()上查找对象信息,它看起来像#34;"是我的新朋友而不是"等级":

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进行排序,以便所有功能(切片等)都能正常工作?

1 个答案:

答案 0 :(得分:4)

答案取决于您正在使用的熊猫版本。使用最新的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