@@ -3738,31 +3738,23 @@ def symmetric_difference(self, other, result_name=None, sort=None):
3738
3738
left_indexer = np .setdiff1d (
3739
3739
np .arange (this .size ), common_indexer , assume_unique = True
3740
3740
)
3741
- left_diff = this ._values . take (left_indexer )
3741
+ left_diff = this .take (left_indexer )
3742
3742
3743
3743
# {other} minus {this}
3744
3744
right_indexer = (indexer == - 1 ).nonzero ()[0 ]
3745
- right_diff = other ._values . take (right_indexer )
3745
+ right_diff = other .take (right_indexer )
3746
3746
3747
- res_values = concat_compat ([left_diff , right_diff ])
3748
- res_values = _maybe_try_sort (res_values , sort )
3749
-
3750
- # pass dtype so we retain object dtype
3751
- result = Index (res_values , name = result_name , dtype = res_values .dtype )
3747
+ res_values = left_diff .append (right_diff )
3748
+ result = _maybe_try_sort (res_values , sort )
3752
3749
3753
- if self ._is_multi :
3754
- self = cast ("MultiIndex" , self )
3750
+ if not self ._is_multi :
3751
+ return Index (result , name = result_name , dtype = res_values .dtype )
3752
+ else :
3753
+ left_diff = cast ("MultiIndex" , left_diff )
3755
3754
if len (result ) == 0 :
3756
- # On equal symmetric_difference MultiIndexes the difference is empty.
3757
- # Therefore, an empty MultiIndex is returned GH#13490
3758
- return type (self )(
3759
- levels = [[] for _ in range (self .nlevels )],
3760
- codes = [[] for _ in range (self .nlevels )],
3761
- names = result .name ,
3762
- )
3763
- return type (self ).from_tuples (result , names = result .name )
3764
-
3765
- return result
3755
+ # result might be an Index, if other was an Index
3756
+ return left_diff .remove_unused_levels ().set_names (result_name )
3757
+ return result .set_names (result_name )
3766
3758
3767
3759
@final
3768
3760
def _assert_can_do_setop (self , other ) -> bool :
0 commit comments