【问题标题】:Index DataFrame with (Multi)Index containing only some of the DataFrame's levelsIndex DataFrame with (Multi)Index 仅包含 DataFrame 的一些级别
【发布时间】:2018-10-01 11:31:36
【问题描述】:

我希望获取具有多索引的数据帧,并使用另一个(多)索引对其进行索引,该索引包含数据帧级别的严格子集。不在其他(多)索引中的数据框中的级别应该返回所有行。一个例子:

>>> df
              col
num chr
1   a    0.845402
    b    0.099432
    c    0.507409
2   a    0.684363
    b    0.582436
    c    0.666528

>>> df['col'].unstack('chr').mean()
chr
a    0.764883
b    0.340934
c    0.586968
dtype: float64

>>> df['col'].unstack('chr').mean().nsmallest(2)
chr
b    0.340934
c    0.586968
dtype: float64

>>> df['col'].unstack('chr').mean().nsmallest(2).index
Index(['b', 'c'], dtype='object', name='chr')

现在,我想在'chr' 级别返回包含'b''c' 的所有df 行,以及'num' 级别中的任何值。另外,我想尝试同样的事情,最后一步返回的索引是MultiIndex(即,当df的索引有两个以上级别时):

>>> df
                  col
num chr foo
1   a   bar  0.790995
        baz  0.883363
    b   bar  0.240376
        baz  0.309544
    c   bar  0.637943
        baz  0.265628
2   a   bar  0.783172
        baz  0.612230
    b   bar  0.729979
        baz  0.846814
    c   bar  0.809676
        baz  0.821503

>>> df['col'].unstack(['chr', 'foo']).mean()
chr  foo
a    bar    0.787084
     baz    0.747796
b    bar    0.485177
     baz    0.578179
c    bar    0.723809
     baz    0.543565
dtype: float64

>>> df['col'].unstack(['chr', 'foo']).mean().nsmallest(2)
chr  foo
b    bar    0.485177
c    baz    0.543565
dtype: float64

>>> df['col'].unstack(['chr', 'foo']).mean().nsmallest(2).index
MultiIndex(levels=[['a', 'b', 'c'], ['bar', 'baz']],
           labels=[[1, 2], [0, 1]],
           names=['chr', 'foo'])

我想选择所有df 的行,其索引在最后两个级别中包含('b', 'bar')('c', 'baz') 以及'num' 级别中的任何值。

【问题讨论】:

    标签: python pandas multi-index


    【解决方案1】:

    我只能用get_level_valuesisin 做到这一点

    s=df['col'].mean(level=[1,2]).nsmallest(2).index.tolist()
    
    df[pd.Series(list(zip(df.index.get_level_values(1),df.index.get_level_values(2)))).isin(s).values]
    Out[163]:
                      col
    num chr foo
    1   b   bar  0.240376
        c   baz  0.265628
    2   b   bar  0.729979
        c   baz  0.821503
    

    【讨论】:

    • 哎呀...希望有一个更惯用的解决方案
    • @BallpointBen 为什么不 reset_index()?多个索引仍在开发中,因此可能存在更多潜在问题
    【解决方案2】:

    我认为最干净的解决方案可能是单独检索所需的行并pd.concat 他们。对于Index 解决方案:

    idx = df['col'].unstack(['chr', 'foo']).mean().nsmallest(2).index
    selected = pd.concat([df.xs(label, level=idx.name, drop_level=False) 
                          for label in idx],
                         axis=0)
    

    idxMultiIndex 时,请改用level=idx.names

    【讨论】:

      猜你喜欢
      • 2020-02-11
      • 2018-06-14
      • 2021-07-24
      • 2021-05-05
      • 2017-08-01
      • 1970-01-01
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多