(self, key)
| 2423 | # -------------------------------------------------------------------- |
| 2424 | |
| 2425 | def __getitem__(self, key): |
| 2426 | key = lib.item_from_zerodim(key) |
| 2427 | if is_scalar(key): |
| 2428 | key = com.cast_scalar_indexer(key) |
| 2429 | |
| 2430 | retval = [] |
| 2431 | for lev, level_codes in zip(self.levels, self.codes, strict=True): |
| 2432 | if level_codes[key] == -1: |
| 2433 | retval.append(np.nan) |
| 2434 | else: |
| 2435 | retval.append(lev[level_codes[key]]) |
| 2436 | |
| 2437 | return tuple(retval) |
| 2438 | else: |
| 2439 | # in general cannot be sure whether the result will be sorted |
| 2440 | sortorder = None |
| 2441 | if com.is_bool_indexer(key): |
| 2442 | key = np.asarray(key, dtype=bool) |
| 2443 | sortorder = self.sortorder |
| 2444 | elif isinstance(key, slice): |
| 2445 | if key.step is None or key.step > 0: |
| 2446 | sortorder = self.sortorder |
| 2447 | elif isinstance(key, Index): |
| 2448 | key = np.asarray(key) |
| 2449 | |
| 2450 | new_codes = [level_codes[key] for level_codes in self.codes] |
| 2451 | |
| 2452 | return MultiIndex( |
| 2453 | levels=self.levels, |
| 2454 | codes=new_codes, |
| 2455 | names=self.names, |
| 2456 | sortorder=sortorder, |
| 2457 | verify_integrity=False, |
| 2458 | ) |
| 2459 | |
| 2460 | def _getitem_slice(self: MultiIndex, slobj: slice) -> MultiIndex: |
| 2461 | """ |
nothing calls this directly
no test coverage detected