$9^{9^9}=?$

# Selecting Pandas DataFrame Observations from Custom Multiple Levels of MultiIndex

Suppose we have a multi-indexed dataframe, and want to select all observations with certain ids in a certain level or levels.

df = pd.DataFrame(np.arange(15).reshape(5,3),
index=[['x','x','x','y','z'],
['a','a','b','b','c'],
[1,2,1,2,3]],
columns=[['VAR', 'VAR', 'VAR'],
['VAR-A','VAR-A', 'VAR-B'],
['var-a','var-b', 'var-c']]
)
df.index.names = ['one', 'two', 'three']

### Sample DataFrame

df
VAR
VAR-A         VAR-B
var-a  var-b  var-c
one two three
x   a   1          0      1      2
2          3      4      5
b   1          6      7      8
y   b   2          9     10     11
z   c   3         12     13     14

[5 rows x 3 columns]

### Selecting From One Level by List

Here's one way to do it:

df[df.index.get_level_values('two').isin(['a', 'c'])]
VAR
VAR-A         VAR-B
var-a  var-b  var-c
one two three
x   a   1          0      1      2
2          3      4      5
z   c   3         12     13     14

[3 rows x 3 columns]

### Selecting From Multiple Levels by Lists

If we want to select an intersection from multiple levels, obviously, we can do:

ix1 = df.index.get_level_values('two').isin(['a', 'c'])
ix2 = df.index.get_level_values('three').isin([1, 3])
df[ix1 & ix2]
VAR
VAR-A         VAR-B
var-a  var-b  var-c
one two three
x   a   1          0      1      2
z   c   3         12     13     14

[2 rows x 3 columns]