@@ -1065,53 +1065,26 @@ def _engine(self):
10651065
10661066 @property
10671067 def _constructor (self ):
1068- return MultiIndex .from_tuples
1068+ return type ( self ) .from_tuples
10691069
10701070 @doc (Index ._shallow_copy )
1071- def _shallow_copy (
1072- self ,
1073- values = None ,
1074- name = lib .no_default ,
1075- levels = None ,
1076- codes = None ,
1077- sortorder = None ,
1078- names = lib .no_default ,
1079- ):
1080- if names is not lib .no_default and name is not lib .no_default :
1081- raise TypeError ("Can only provide one of `names` and `name`" )
1082- elif names is lib .no_default :
1083- names = name if name is not lib .no_default else self .names
1071+ def _shallow_copy (self , values = None , name = lib .no_default ):
1072+ names = name if name is not lib .no_default else self .names
10841073
10851074 if values is not None :
1086- assert levels is None and codes is None
1087- return MultiIndex .from_tuples (values , sortorder = sortorder , names = names )
1075+ return type (self ).from_tuples (values , sortorder = None , names = names )
10881076
1089- levels = levels if levels is not None else self .levels
1090- codes = codes if codes is not None else self .codes
1091-
1092- result = MultiIndex (
1093- levels = levels ,
1094- codes = codes ,
1095- sortorder = sortorder ,
1077+ result = type (self )(
1078+ levels = self .levels ,
1079+ codes = self .codes ,
1080+ sortorder = None ,
10961081 names = names ,
10971082 verify_integrity = False ,
10981083 )
10991084 result ._cache = self ._cache .copy ()
11001085 result ._cache .pop ("levels" , None ) # GH32669
11011086 return result
11021087
1103- def symmetric_difference (self , other , result_name = None , sort = None ):
1104- # On equal symmetric_difference MultiIndexes the difference is empty.
1105- # Therefore, an empty MultiIndex is returned GH13490
1106- tups = Index .symmetric_difference (self , other , result_name , sort )
1107- if len (tups ) == 0 :
1108- return MultiIndex (
1109- levels = [[] for _ in range (self .nlevels )],
1110- codes = [[] for _ in range (self .nlevels )],
1111- names = tups .name ,
1112- )
1113- return type (self ).from_tuples (tups , names = tups .name )
1114-
11151088 # --------------------------------------------------------------------
11161089
11171090 def copy (
@@ -1177,12 +1150,18 @@ def copy(
11771150 if codes is None :
11781151 codes = deepcopy (self .codes )
11791152
1180- new_index = self ._shallow_copy (
1153+ levels = levels if levels is not None else self .levels
1154+ codes = codes if codes is not None else self .codes
1155+
1156+ new_index = type (self )(
11811157 levels = levels ,
11821158 codes = codes ,
1183- names = names ,
11841159 sortorder = self .sortorder ,
1160+ names = names ,
1161+ verify_integrity = False ,
11851162 )
1163+ new_index ._cache = self ._cache .copy ()
1164+ new_index ._cache .pop ("levels" , None ) # GH32669
11861165
11871166 if dtype :
11881167 warnings .warn (
@@ -3612,6 +3591,18 @@ def _convert_can_do_setop(self, other):
36123591
36133592 return other , result_names
36143593
3594+ def symmetric_difference (self , other , result_name = None , sort = None ):
3595+ # On equal symmetric_difference MultiIndexes the difference is empty.
3596+ # Therefore, an empty MultiIndex is returned GH13490
3597+ tups = Index .symmetric_difference (self , other , result_name , sort )
3598+ if len (tups ) == 0 :
3599+ return type (self )(
3600+ levels = [[] for _ in range (self .nlevels )],
3601+ codes = [[] for _ in range (self .nlevels )],
3602+ names = tups .name ,
3603+ )
3604+ return type (self ).from_tuples (tups , names = tups .name )
3605+
36153606 # --------------------------------------------------------------------
36163607
36173608 @doc (Index .astype )
0 commit comments