Skip to content

Commit 79e04b6

Browse files
author
cloudboat
committed
PERF: Optimize MultiIndex.insert_level to avoid unnecessary type conversions & REF: Remove unnecessary else branch in MultiIndex.insert_level & REF: Simplify names handling in MultiIndex.insert_level
1 parent 87bd44b commit 79e04b6

File tree

2 files changed

+9
-48
lines changed

2 files changed

+9
-48
lines changed

pandas/core/indexes/multi.py

Lines changed: 9 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -2710,38 +2710,7 @@ def reorder_levels(self, order) -> MultiIndex:
27102710
result = self._reorder_ilevels(order)
27112711
return result
27122712

2713-
def insert_level(self, position: int, value, name=None) -> MultiIndex:
2714-
"""
2715-
Insert a new level at the specified position and return a new MultiIndex.
2716-
2717-
Parameters
2718-
----------
2719-
position : int
2720-
The integer position where the new level should be inserted.
2721-
Must be between 0 and ``self.nlevels`` (inclusive).
2722-
value : scalar or sequence
2723-
Values for the inserted level. If a scalar is provided, it is
2724-
broadcast to the length of the index. If a sequence is provided,
2725-
it must be the same length as the index.
2726-
name : Hashable, default None
2727-
Name of the inserted level. If not provided, the inserted level
2728-
name will be ``None``.
2729-
2730-
Returns
2731-
-------
2732-
MultiIndex
2733-
A new ``MultiIndex`` with the inserted level.
2734-
2735-
Examples
2736-
--------
2737-
>>> idx = pd.MultiIndex.from_tuples([("A", 1), ("B", 2)], names=["x", "y"])
2738-
>>> idx.insert_level(0, "grp")
2739-
MultiIndex([('grp', 'A', 1), ('grp', 'B', 2)],
2740-
names=[None, 'x', 'y'])
2741-
>>> idx.insert_level(1, ["L1", "L2"], name="z")
2742-
MultiIndex([('A', 'L1', 1), ('B', 'L2', 2)],
2743-
names=['x', 'z', 'y'])
2744-
"""
2713+
def insert_level(self, position: int, value, name=None):
27452714
if not isinstance(position, int):
27462715
raise TypeError("position must be an integer")
27472716

@@ -2755,25 +2724,17 @@ def insert_level(self, position: int, value, name=None) -> MultiIndex:
27552724
if len(value) != len(self):
27562725
raise ValueError("Length of values must match length of index")
27572726

2758-
tuples = list(self)
2759-
27602727
new_tuples = []
2761-
for i, tup in enumerate(tuples):
2762-
if isinstance(tup, tuple):
2763-
new_tuple = list(tup)
2764-
new_tuple.insert(position, value[i])
2765-
new_tuples.append(tuple(new_tuple))
2728+
for i, tup in enumerate(self):
2729+
if position == 0:
2730+
new_tuple = (value[i],) + tup
2731+
elif position == len(tup):
2732+
new_tuple = tup + (value[i],)
27662733
else:
2767-
new_tuple = [tup]
2768-
new_tuple.insert(position, value[i])
2769-
new_tuples.append(tuple(new_tuple))
2770-
2771-
if self.names is not None:
2772-
new_names = list(self.names)
2773-
else:
2774-
new_names = [None] * self.nlevels
2734+
new_tuple = tup[:position] + (value[i],) + tup[position:]
2735+
new_tuples.append(new_tuple)
27752736

2776-
new_names.insert(position, name)
2737+
new_names = self.names[:position] + [name] + self.names[position:]
27772738

27782739
return MultiIndex.from_tuples(new_tuples, names=new_names)
27792740

pyarrow

-1.57 KB
Binary file not shown.

0 commit comments

Comments
 (0)