@@ -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
0 commit comments