我通过使用另一个数据框创建了一个具有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中所述,此方法运行良好。
在文档中,它还说,在“需要使用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排序,以便所有功能(切片等)都能正常工作?
答案取决于您使用的熊猫版本。对于最新的熊猫(> = 0.17.0),您确实可以使用level
关键字来指定对多级索引进行排序:
df = df.sort_index(level=0)
但是,如果您的熊猫较旧(<0.17.0),则此level
关键字尚不可用,但是您可以使用以下sortlevel
方法:
df = df.sortlevel(level=0)
但是请注意,如果要对所有级别进行排序,则无需指定level
关键字,您可以执行以下操作:
df = df.sort_index()
这将适用于最新版本和较旧版本的熊猫。
有关排序API中这些更改的摘要,请参见http://pandas.pydata.org/pandas-docs/stable/whatsnew.html#changes-to-sorting-api