@@ -1065,53 +1065,26 @@ def _engine(self):
1065
1065
1066
1066
@property
1067
1067
def _constructor (self ):
1068
- return MultiIndex .from_tuples
1068
+ return type ( self ) .from_tuples
1069
1069
1070
1070
@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
1084
1073
1085
1074
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 )
1088
1076
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 ,
1096
1081
names = names ,
1097
1082
verify_integrity = False ,
1098
1083
)
1099
1084
result ._cache = self ._cache .copy ()
1100
1085
result ._cache .pop ("levels" , None ) # GH32669
1101
1086
return result
1102
1087
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
-
1115
1088
# --------------------------------------------------------------------
1116
1089
1117
1090
def copy (
@@ -1177,12 +1150,18 @@ def copy(
1177
1150
if codes is None :
1178
1151
codes = deepcopy (self .codes )
1179
1152
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 )(
1181
1157
levels = levels ,
1182
1158
codes = codes ,
1183
- names = names ,
1184
1159
sortorder = self .sortorder ,
1160
+ names = names ,
1161
+ verify_integrity = False ,
1185
1162
)
1163
+ new_index ._cache = self ._cache .copy ()
1164
+ new_index ._cache .pop ("levels" , None ) # GH32669
1186
1165
1187
1166
if dtype :
1188
1167
warnings .warn (
@@ -3612,6 +3591,18 @@ def _convert_can_do_setop(self, other):
3612
3591
3613
3592
return other , result_names
3614
3593
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
+
3615
3606
# --------------------------------------------------------------------
3616
3607
3617
3608
@doc (Index .astype )
0 commit comments