【问题标题】:Slice MultiIndex pandas DataFrame by position按位置切片 MultiIndex pandas DataFrame
【发布时间】:2017-05-08 10:16:28
【问题描述】:

我目前正在尝试按位置对具有三个级别的 MuliIndex DataFrame 进行切片。 我正在使用熊猫 19.1

Level0  Level1  Level2      Value
03-00368    A   Item111     6.9
03-00368    A   Item333     19.2
03-00368    B   Item111     9.7
03-00368    B   Item222     17.4
04-00176    C   Item110     17.4
04-00176    C   Item111     9.7
04-00246    D   Item46      12.5
04-00246    D   Item66      5.6
04-00246    D   Item99      11.2
04-00247    E   Item23      12.5
04-00247    E   Item24      5.6
04-00247    E   Item111     11.2
04-00247    F   Item23      7.9
04-00247    F   Item24      9.7
04-00247    F   Item111     12.5
04-00247    G   Item46      11.2
04-00247    G   Item66      9.7
04-00247    G   Item999     9.7
04-00247    H   Item23      11.2
04-00247    H   Item94      7.9
04-00247    H   Item111     11.2
04-00247    I   Item46      5.6
04-00247    I   Item66      12.5
04-00247    I   Item888     11.2
04-00353    J   Item66      12.5
04-00353    J   Item99      12.5
04-00354    K   Item43      12.5
04-00354    K   Item94      12.5
04-00355    L   Item54      50
04-00355    L   Item99      50

目前我可以实现:

df.loc[(slice('03-00368', '04-00361'), slice(None), slice(None)), :]

但实际上我不知道标签是什么。我只想选择前十个级别 0,所以我尝试了这个(以及许多其他类似的东西):

>>> df.iloc[(slice(0, 10), slice(None), slice(None)), :]
TypeError: unorderable types: int() >= NoneType()

最终目标是限制显示的最终行数,不破坏 Level0 索引

>>>df.iloc[(0,1,), :]
Level0   Level1 Level2      Value
03-00368    A   Item111     6.9
03-00368    A   Item333     19.2

注意它只返回前两行,我希望结果是:

Level0  Level1  Level2      Value
03-00368    A   Item111     6.9
03-00368    A   Item333     19.2
03-00368    B   Item111     9.7
03-00368    B   Item222     17.4
04-00176    C   Item110     17.4
04-00176    C   Item111     9.7

有一些 hacky 方法可以做到这一点,但我发帖是因为我想知道我做错了什么,或者为什么我不能期望能够以这种方式切片 MultiIndex。

【问题讨论】:

    标签: python pandas multi-index


    【解决方案1】:

    方法 1
    groupby + head

    df.groupby(level=0).head(10)
    

    方法 2
    不必要的冗长
    IndexSlice

    df.sort_index().loc[pd.IndexSlice[df.index.levels[0][:10], :, :], :]
    

    方法3
    loc

    df.loc[df.index.levels[0][:10].tolist()]
    

    【讨论】:

    • 详细情况也允许在任何级别工作:slc = pd.IndexSlice[:,df.index.levels[1][:10],:]df = df.loc[slc, :]
    • 如何在链中使用它?喜欢df.loc[df["Value"] > 9.7).loc[df.index.levels[0][ : 10].tolist()]??但是df 指的是原始数据帧,而不是已经子集的数据帧
    【解决方案2】:

    您可以按级别分组并以这种方式获得前两个

    df.groupby(level=0).head(2)
    

    【讨论】:

      猜你喜欢
      • 2017-03-28
      • 2020-09-10
      • 2014-05-24
      • 2012-08-06
      • 2016-08-05
      • 1970-01-01
      • 1970-01-01
      • 2018-12-29
      相关资源
      最近更新 更多