索引DataFrame与(多)索引仅包含一些DataFrame的级别

时间:2018-04-20 17:26:57

标签: python pandas multi-index

我希望采用带有多索引的数据帧,并将其与另一个(多个)索引一起索引,该索引包含数据帧级别的严格子集。数据框中的级别不在其他(多)索引中,应该返回所有行。一个例子:

df

现在,我想要返回'b'级别中包含'c''chr'的所有行'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'行以及def mult_table(): result = [] for i in a: for j in a: result.append(i*j) return result 级别中的任何值。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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