I have a dataframe like
df = pd.DataFrame({
'level0': [0,1,2],
'level1': ['a', 'b', 'b'],
'level2':['x', 'x', 'x'],
'data': [0.12, 0.34, 0.45]}
).set_index(['level0', 'level1', 'level2'])
| level0 | level1 | level 2 | data |
|---|---|---|---|
| 0 | a | x | 0.12 |
| 1 | b | x | 0.34 |
| 2 | b | x | 0.56 |
If level0, level1, and level2 are the index levels, I want to access the data at (2, b) but keep the first two levels of labels. If I do df.loc[(2, 'b')] the output is
| level2 | data |
|---|---|
| x | 0.56 |
but my desired output is
| level0 | level1 | level 2 | data |
|---|---|---|---|
| 2 | b | x | 0.56 |
How do I keep the levels 0 and 1 while using loc? I could add these levels back afterwards, but this is slightly annoying, and I'm doing this frequently enough to wonder if there's a one step solution.
CodePudding user response:
You can use MultiIndex.get_locs:
>>> df.loc[df.index.get_locs((2, 'b'))]
data
level0 level1 level2
2 b x 0.45
