diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index c3343f149005c..c9b216cfabe74 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -2183,7 +2183,7 @@ def _get_consensus_name(self, other): return self._shallow_copy(name=name) return self - def union(self, other): + def union(self, other, sort=True): """ Form the union of two Index objects and sorts if possible. @@ -2241,27 +2241,29 @@ def union(self, other): allow_fill=False) result = _concat._concat_compat((self._values, other_diff)) - try: - self._values[0] < other_diff[0] - except TypeError as e: - warnings.warn("%s, sort order is undefined for " - "incomparable objects" % e, RuntimeWarning, - stacklevel=3) - else: - types = frozenset((self.inferred_type, - other.inferred_type)) - if not types & _unsortable_types: - result.sort() + if sort: + try: + self._values[0] < other_diff[0] + except TypeError as e: + warnings.warn("%s, sort order is undefined for " + "incomparable objects" % e, RuntimeWarning, + stacklevel=3) + else: + types = frozenset((self.inferred_type, + other.inferred_type)) + if not types & _unsortable_types: + result.sort() else: result = self._values - try: - result = np.sort(result) - except TypeError as e: - warnings.warn("%s, sort order is undefined for " - "incomparable objects" % e, RuntimeWarning, - stacklevel=3) + if sort: + try: + result = np.sort(result) + except TypeError as e: + warnings.warn("%s, sort order is undefined for " + "incomparable objects" % e, RuntimeWarning, + stacklevel=3) # for subclasses return self._wrap_union_result(other, result) @@ -2326,7 +2328,7 @@ def intersection(self, other): taken.name = None return taken - def difference(self, other): + def difference(self, other, sort=True): """ Return a new Index with elements from the index that are not in `other`. @@ -2366,14 +2368,15 @@ def difference(self, other): label_diff = np.setdiff1d(np.arange(this.size), indexer, assume_unique=True) the_diff = this.values.take(label_diff) - try: - the_diff = sorting.safe_sort(the_diff) - except TypeError: - pass + if sort: + try: + the_diff = sorting.safe_sort(the_diff) + except TypeError: + pass return this._shallow_copy(the_diff, name=result_name, freq=None) - def symmetric_difference(self, other, result_name=None): + def symmetric_difference(self, other, result_name=None, sort=True): """ Compute the symmetric difference of two Index objects. It's sorted if sorting is possible. @@ -2426,10 +2429,11 @@ def symmetric_difference(self, other, result_name=None): right_diff = other.values.take(right_indexer) the_diff = _concat._concat_compat([left_diff, right_diff]) - try: - the_diff = sorting.safe_sort(the_diff) - except TypeError: - pass + if sort: + try: + the_diff = sorting.safe_sort(the_diff) + except TypeError: + pass attribs = self._get_attributes_dict() attribs['name'] = result_name @@ -4220,3 +4224,4 @@ def _trim_front(strings): def _validate_join_method(method): if method not in ['left', 'right', 'inner', 'outer']: raise ValueError('do not recognize join method %s' % method) +