索引数据帧,(多)索引仅包含部分数据帧的级别



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

>>> 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'])

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

我只能用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
我认为

最干净的解决方案可能是单独检索所需的行并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

最新更新