Skip to content

Commit 1893ffd

Browse files
xflr6jreback
authored andcommitted
API: deprecate Index.sym_diff in favor of symmetric_difference
closes #12591 closes #12594
1 parent e4df1ac commit 1893ffd

File tree

6 files changed

+28
-20
lines changed

6 files changed

+28
-20
lines changed

doc/source/api.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -1374,7 +1374,7 @@ Combining / joining / set operations
13741374
Index.intersection
13751375
Index.union
13761376
Index.difference
1377-
Index.sym_diff
1377+
Index.symmetric_difference
13781378

13791379
Selecting
13801380
~~~~~~~~~

doc/source/indexing.rst

+2-2
Original file line numberDiff line numberDiff line change
@@ -1359,7 +1359,7 @@ operators. Difference is provided via the ``.difference()`` method.
13591359
a & b
13601360
a.difference(b)
13611361
1362-
Also available is the ``sym_diff (^)`` operation, which returns elements
1362+
Also available is the ``symmetric_difference (^)`` operation, which returns elements
13631363
that appear in either ``idx1`` or ``idx2`` but not both. This is
13641364
equivalent to the Index created by ``idx1.difference(idx2).union(idx2.difference(idx1))``,
13651365
with duplicates dropped.
@@ -1368,7 +1368,7 @@ with duplicates dropped.
13681368
13691369
idx1 = pd.Index([1, 2, 3, 4])
13701370
idx2 = pd.Index([2, 3, 4, 5])
1371-
idx1.sym_diff(idx2)
1371+
idx1.symmetric_difference(idx2)
13721372
idx1 ^ idx2
13731373
13741374
Missing values

doc/source/whatsnew/v0.18.1.txt

+2
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ API changes
6060
Deprecations
6161
^^^^^^^^^^^^
6262

63+
- The method name ``Index.sym_diff()`` is deprecated and can be replaced by ``Index.symmetric_difference()`` (:issue:`12591`)
64+
6365

6466

6567

pandas/indexes/base.py

+7-5
Original file line numberDiff line numberDiff line change
@@ -1619,7 +1619,7 @@ def __or__(self, other):
16191619
return self.union(other)
16201620

16211621
def __xor__(self, other):
1622-
return self.sym_diff(other)
1622+
return self.symmetric_difference(other)
16231623

16241624
def union(self, other):
16251625
"""
@@ -1796,7 +1796,7 @@ def difference(self, other):
17961796

17971797
diff = deprecate('diff', difference)
17981798

1799-
def sym_diff(self, other, result_name=None):
1799+
def symmetric_difference(self, other, result_name=None):
18001800
"""
18011801
Compute the sorted symmetric difference of two Index objects.
18021802
@@ -1807,11 +1807,11 @@ def sym_diff(self, other, result_name=None):
18071807
18081808
Returns
18091809
-------
1810-
sym_diff : Index
1810+
symmetric_difference : Index
18111811
18121812
Notes
18131813
-----
1814-
``sym_diff`` contains elements that appear in either ``idx1`` or
1814+
``symmetric_difference`` contains elements that appear in either ``idx1`` or
18151815
``idx2`` but not both. Equivalent to the Index created by
18161816
``(idx1 - idx2) + (idx2 - idx1)`` with duplicates dropped.
18171817
@@ -1822,7 +1822,7 @@ def sym_diff(self, other, result_name=None):
18221822
--------
18231823
>>> idx1 = Index([1, 2, 3, 4])
18241824
>>> idx2 = Index([2, 3, 4, 5])
1825-
>>> idx1.sym_diff(idx2)
1825+
>>> idx1.symmetric_difference(idx2)
18261826
Int64Index([1, 5], dtype='int64')
18271827
18281828
You can also use the ``^`` operator:
@@ -1843,6 +1843,8 @@ def sym_diff(self, other, result_name=None):
18431843
attribs['freq'] = None
18441844
return self._shallow_copy_with_infer(the_diff, **attribs)
18451845

1846+
sym_diff = deprecate('sym_diff', symmetric_difference)
1847+
18461848
def get_loc(self, key, method=None, tolerance=None):
18471849
"""
18481850
Get integer location for requested label

pandas/tests/indexes/common.py

+10-6
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ def test_setops_errorcases(self):
305305
# # non-iterable input
306306
cases = [0.5, 'xxx']
307307
methods = [idx.intersection, idx.union, idx.difference,
308-
idx.sym_diff]
308+
idx.symmetric_difference]
309309

310310
for method in methods:
311311
for case in cases:
@@ -404,15 +404,15 @@ def test_difference_base(self):
404404
with tm.assertRaisesRegexp(TypeError, msg):
405405
result = first.difference([1, 2, 3])
406406

407-
def test_symmetric_diff(self):
407+
def test_symmetric_difference(self):
408408
for name, idx in compat.iteritems(self.indices):
409409
first = idx[1:]
410410
second = idx[:-1]
411411
if isinstance(idx, CategoricalIndex):
412412
pass
413413
else:
414414
answer = idx[[0, -1]]
415-
result = first.sym_diff(second)
415+
result = first.symmetric_difference(second)
416416
self.assertTrue(tm.equalContents(result, answer))
417417

418418
# GH 10149
@@ -422,17 +422,21 @@ def test_symmetric_diff(self):
422422
if isinstance(idx, PeriodIndex):
423423
msg = "can only call with other PeriodIndex-ed objects"
424424
with tm.assertRaisesRegexp(ValueError, msg):
425-
result = first.sym_diff(case)
425+
result = first.symmetric_difference(case)
426426
elif isinstance(idx, CategoricalIndex):
427427
pass
428428
else:
429-
result = first.sym_diff(case)
429+
result = first.symmetric_difference(case)
430430
self.assertTrue(tm.equalContents(result, answer))
431431

432432
if isinstance(idx, MultiIndex):
433433
msg = "other must be a MultiIndex or a list of tuples"
434434
with tm.assertRaisesRegexp(TypeError, msg):
435-
result = first.sym_diff([1, 2, 3])
435+
result = first.symmetric_difference([1, 2, 3])
436+
437+
# 12591 deprecated
438+
with tm.assert_produces_warning(FutureWarning):
439+
first.sym_diff(second)
436440

437441
def test_insert_base(self):
438442

pandas/tests/indexes/test_base.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -641,11 +641,11 @@ def test_difference(self):
641641
self.assertEqual(len(result), 0)
642642
self.assertEqual(result.name, first.name)
643643

644-
def test_symmetric_diff(self):
644+
def test_symmetric_difference(self):
645645
# smoke
646646
idx1 = Index([1, 2, 3, 4], name='idx1')
647647
idx2 = Index([2, 3, 4, 5])
648-
result = idx1.sym_diff(idx2)
648+
result = idx1.symmetric_difference(idx2)
649649
expected = Index([1, 5])
650650
self.assertTrue(tm.equalContents(result, expected))
651651
self.assertIsNone(result.name)
@@ -658,7 +658,7 @@ def test_symmetric_diff(self):
658658
# multiIndex
659659
idx1 = MultiIndex.from_tuples(self.tuples)
660660
idx2 = MultiIndex.from_tuples([('foo', 1), ('bar', 3)])
661-
result = idx1.sym_diff(idx2)
661+
result = idx1.symmetric_difference(idx2)
662662
expected = MultiIndex.from_tuples([('bar', 2), ('baz', 3), ('bar', 3)])
663663
self.assertTrue(tm.equalContents(result, expected))
664664

@@ -667,7 +667,7 @@ def test_symmetric_diff(self):
667667
# and the correct non-nan values are there. punt on sorting.
668668
idx1 = Index([1, 2, 3, np.nan])
669669
idx2 = Index([0, 1, np.nan])
670-
result = idx1.sym_diff(idx2)
670+
result = idx1.symmetric_difference(idx2)
671671
# expected = Index([0.0, np.nan, 2.0, 3.0, np.nan])
672672

673673
nans = pd.isnull(result)
@@ -679,11 +679,11 @@ def test_symmetric_diff(self):
679679
idx1 = Index([1, 2, 3, 4], name='idx1')
680680
idx2 = np.array([2, 3, 4, 5])
681681
expected = Index([1, 5])
682-
result = idx1.sym_diff(idx2)
682+
result = idx1.symmetric_difference(idx2)
683683
self.assertTrue(tm.equalContents(result, expected))
684684
self.assertEqual(result.name, 'idx1')
685685

686-
result = idx1.sym_diff(idx2, result_name='new_name')
686+
result = idx1.symmetric_difference(idx2, result_name='new_name')
687687
self.assertTrue(tm.equalContents(result, expected))
688688
self.assertEqual(result.name, 'new_name')
689689

0 commit comments

Comments
 (0)