首页 > 解决方案 > 按给定级别和列值的特定索引过滤 pandas MultiIndex

问题描述

给定以下数据框:

import pandas as pd
import numpy as np

indices = [['A', 'B', 'C'], ['a', 'b', 'c', 'd'], ['1', '2', '3']]

index = pd.MultiIndex.from_product(indices, names=['first', 'second', 'third'])

df = pd.DataFrame(np.random.randint(10, size=(36, 4)), index=index, columns=['Val1','Val2',' Val3', 'Val4'])

例如:

                    Val1  Val2  Val3  Val4
first second third                        
A     a      1         1     7     2     1
             2         0     0     8     6
             3         3     2     0     5
      b      1         3     8     8     8
             2         3     1     0     5
             3         7     2     8     5
      c      1         9     9     5     3
             2         2     5     5     8
             3         7     5     1     5
      d      1         2     7     8     6
             2         9     0     0     2
             3         9     4     1     4
B     a      1         1     2     3     3
             2         3     2     3     1
             3         1     3     2     2
      b      1         4     4     3     1
             2         9     4     8     2
             3         6     7     8     8
      c      1         6     6     3     2
             2         2     6     5     6
             3         6     4     2     7
      d      1         1     1     1     5
             2         6     4     8     1
             3         3     4     3     1
C     a      1         0     3     4     0
             2         5     0     1     4
             3         1     1     5     7
      b      1         2     6     1     7
             2         2     6     4     3
             3         0     5     6     6
      c      1         0     2     3     7
             2         7     1     1     1
             3         2     6     2     0
      d      1         6     2     2     1
             2         9     3     1     9
             3         7     5     6     1

我将如何按任何索引级别和特定列值过滤此数据框?

编辑

例如,如果我想保留所有更高级别的索引(即level=0level=1),如果相应的third索引 ( level=2) 的1Val 2值大于5. 因此,如果索引1中的third索引不具有Val2大于 的值5,则与该second索引对应的级别索引将从数据帧中删除。

我尝试解决方案,或者至少传达我的意图(因为这会产生错误):

df[df.loc[pd.IndexSlice[:, :, '1'], 'Val2'] > 5]

这给了我以下错误:

pandas.core.indexing.IndexingError: Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match)

在此示例中,我的预期输出如下:

                    Val1  Val2  Val3  Val4
first second third                        
A     a      1         1     7     2     1
             2         0     0     8     6
             3         3     2     0     5
      b      1         3     8     8     8
             2         3     1     0     5
             3         7     2     8     5
      c      1         9     9     5     3
             2         2     5     5     8
             3         7     5     1     5
      d      1         2     7     8     6
             2         9     0     0     2
             3         9     4     1     4
B     c      1         6     6     3     2
             2         2     6     5     6
             3         6     4     2     7
C     b      1         2     6     1     7
             2         2     6     4     3
             3         0     5     6     6

好奇这是否可以实现,df.filter()或者我是否缺少一种在 a 上执行此过滤的简单方法MultiIndex?先感谢您。

标签: pythonpandasmulti-index

解决方案


推荐阅读