【问题标题】:Sort pandas MultiIndex对 pandas MultiIndex 进行排序
【发布时间】:2016-04-08 00:41:46
【问题描述】:

我使用另一个 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() got an unexpected keyword argument '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 进行排序,以便所有功能(切片等)都能正常工作?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

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

    df = df.sort_index(level=0)
    

    但是,如果你有一个更老的 pandas (,这个 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) 就足以获得所有功能了吗?谢谢!
    • 从有序索引切片现在会弹出错误:1. "idx = pd.IndexSlice" 2. "subset = multindex_df.loc[idx[['el: DE22C'],['el '],['input'],:,:]]" 带来 ""KeyError: 'MultiIndex Slicing 要求索引是完全 lexsorted tuple len (5), lexsort depth (0)'"
    • 我又错了。重新创建后我忘了对索引进行排序;)非常感谢!
    猜你喜欢
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 2018-08-22
    • 2017-09-14
    • 2023-04-03
    • 1970-01-01
    • 2016-07-02
    相关资源
    最近更新 更多