Pandas多重索引排序

5

我使用另一个Dataframe创建了一个具有MultiIndex的数据框:

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所述,这个方法可以正常工作。

文档还指出,在“多重索引需要排序”一节中,标签需要排序才能正确使用索引和切片功能。

但是不知何故,

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

6

答案取决于您使用的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


我的错误!我一直在使用0.16.2版本,现在已经更新到0.17.1版本。所以只需应用*multindex_df.sort_index(inplace=True)*就足以获得所有功能吗?谢谢! - Cord Kaldemeyer
从有序索引中进行切片现在会弹出一个错误:1. "idx = pd.IndexSlice" 2. "subset = multindex_df.loc[idx[['el: DE22C'],['el'],['input'],:,:]]" 引发了 "KeyError: 'MultiIndex Slicing requires the index to be fully lexsorted tuple len (5), lexsort depth (0)'"。 - Cord Kaldemeyer
我又犯了错误。我重新创建后忘记排序索引了 ;) 非常感谢! - Cord Kaldemeyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接