Skip to content

Commit 551f424

Browse files
Merge pull request #10812 from jorisvandenbossche/depr-combine
Deprecate combineAdd and combineMult (GH10735)
2 parents 2113672 + a61d299 commit 551f424

File tree

4 files changed

+76
-50
lines changed

4 files changed

+76
-50
lines changed

doc/source/api.rst

-2
Original file line numberDiff line numberDiff line change
@@ -808,9 +808,7 @@ Binary operator functions
808808
DataFrame.ne
809809
DataFrame.eq
810810
DataFrame.combine
811-
DataFrame.combineAdd
812811
DataFrame.combine_first
813-
DataFrame.combineMult
814812

815813
Function application, GroupBy
816814
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

doc/source/whatsnew/v0.17.0.txt

+5-1
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,11 @@ Deprecations
558558
===================== =================================
559559

560560
- ``Categorical.name`` was deprecated to make ``Categorical`` more ``numpy.ndarray`` like. Use ``Series(cat, name="whatever")`` instead (:issue:`10482`).
561-
- ``drop_duplicates`` and ``duplicated``'s ``take_last`` keyword was removed in favor of ``keep``. (:issue:`6511`, :issue:`8505`)
561+
- ``drop_duplicates`` and ``duplicated``'s ``take_last`` keyword was deprecated in favor of ``keep``. (:issue:`6511`, :issue:`8505`)
562+
- ``DataFrame.combineAdd`` and ``DataFrame.combineMult`` are deprecated. They
563+
can easily be replaced by using the ``add`` and ``mul`` methods:
564+
``DataFrame.add(other, fill_value=0)`` and ``DataFrame.mul(other, fill_value=1.)``
565+
(:issue:`10735`).
562566

563567
.. _whatsnew_0170.prior_deprecations:
564568

pandas/core/frame.py

+20
Original file line numberDiff line numberDiff line change
@@ -4900,6 +4900,8 @@ def isin(self, values):
49004900

49014901
def combineAdd(self, other):
49024902
"""
4903+
DEPRECATED. Use ``DataFrame.add(other, fill_value=0.)`` instead.
4904+
49034905
Add two DataFrame objects and do not propagate
49044906
NaN values, so if for a (column, time) one frame is missing a
49054907
value, it will default to the other frame's value (which might
@@ -4912,11 +4914,21 @@ def combineAdd(self, other):
49124914
Returns
49134915
-------
49144916
DataFrame
4917+
4918+
See also
4919+
--------
4920+
DataFrame.add
4921+
49154922
"""
4923+
warnings.warn("'combineAdd' is deprecated. Use "
4924+
"'DataFrame.add(other, fill_value=0.)' instead",
4925+
FutureWarning, stacklevel=2)
49164926
return self.add(other, fill_value=0.)
49174927

49184928
def combineMult(self, other):
49194929
"""
4930+
DEPRECATED. Use ``DataFrame.mul(other, fill_value=1.)`` instead.
4931+
49204932
Multiply two DataFrame objects and do not propagate NaN values, so if
49214933
for a (column, time) one frame is missing a value, it will default to
49224934
the other frame's value (which might be NaN as well)
@@ -4928,7 +4940,15 @@ def combineMult(self, other):
49284940
Returns
49294941
-------
49304942
DataFrame
4943+
4944+
See also
4945+
--------
4946+
DataFrame.mul
4947+
49314948
"""
4949+
warnings.warn("'combineMult' is deprecated. Use "
4950+
"'DataFrame.mul(other, fill_value=1.)' instead",
4951+
FutureWarning, stacklevel=2)
49324952
return self.mul(other, fill_value=1.)
49334953

49344954

pandas/tests/test_frame.py

+51-47
Original file line numberDiff line numberDiff line change
@@ -11787,61 +11787,65 @@ def test_update_from_non_df(self):
1178711787
assert_frame_equal(df, expected)
1178811788

1178911789
def test_combineAdd(self):
11790-
# trivial
11791-
comb = self.frame.combineAdd(self.frame)
11792-
assert_frame_equal(comb, self.frame * 2)
1179311790

11794-
# more rigorous
11795-
a = DataFrame([[1., nan, nan, 2., nan]],
11796-
columns=np.arange(5))
11797-
b = DataFrame([[2., 3., nan, 2., 6., nan]],
11798-
columns=np.arange(6))
11799-
expected = DataFrame([[3., 3., nan, 4., 6., nan]],
11800-
columns=np.arange(6))
11801-
11802-
result = a.combineAdd(b)
11803-
assert_frame_equal(result, expected)
11804-
result2 = a.T.combineAdd(b.T)
11805-
assert_frame_equal(result2, expected.T)
11806-
11807-
expected2 = a.combine(b, operator.add, fill_value=0.)
11808-
assert_frame_equal(expected, expected2)
11809-
11810-
# corner cases
11811-
comb = self.frame.combineAdd(self.empty)
11812-
assert_frame_equal(comb, self.frame)
11813-
11814-
comb = self.empty.combineAdd(self.frame)
11815-
assert_frame_equal(comb, self.frame)
11816-
11817-
# integer corner case
11818-
df1 = DataFrame({'x': [5]})
11819-
df2 = DataFrame({'x': [1]})
11820-
df3 = DataFrame({'x': [6]})
11821-
comb = df1.combineAdd(df2)
11822-
assert_frame_equal(comb, df3)
11823-
11824-
# mixed type GH2191
11825-
df1 = DataFrame({'A': [1, 2], 'B': [3, 4]})
11826-
df2 = DataFrame({'A': [1, 2], 'C': [5, 6]})
11827-
rs = df1.combineAdd(df2)
11828-
xp = DataFrame({'A': [2, 4], 'B': [3, 4.], 'C': [5, 6.]})
11829-
assert_frame_equal(xp, rs)
11791+
with tm.assert_produces_warning(FutureWarning):
11792+
# trivial
11793+
comb = self.frame.combineAdd(self.frame)
11794+
assert_frame_equal(comb, self.frame * 2)
11795+
11796+
# more rigorous
11797+
a = DataFrame([[1., nan, nan, 2., nan]],
11798+
columns=np.arange(5))
11799+
b = DataFrame([[2., 3., nan, 2., 6., nan]],
11800+
columns=np.arange(6))
11801+
expected = DataFrame([[3., 3., nan, 4., 6., nan]],
11802+
columns=np.arange(6))
11803+
11804+
result = a.combineAdd(b)
11805+
assert_frame_equal(result, expected)
11806+
result2 = a.T.combineAdd(b.T)
11807+
assert_frame_equal(result2, expected.T)
11808+
11809+
expected2 = a.combine(b, operator.add, fill_value=0.)
11810+
assert_frame_equal(expected, expected2)
11811+
11812+
# corner cases
11813+
comb = self.frame.combineAdd(self.empty)
11814+
assert_frame_equal(comb, self.frame)
11815+
11816+
comb = self.empty.combineAdd(self.frame)
11817+
assert_frame_equal(comb, self.frame)
11818+
11819+
# integer corner case
11820+
df1 = DataFrame({'x': [5]})
11821+
df2 = DataFrame({'x': [1]})
11822+
df3 = DataFrame({'x': [6]})
11823+
comb = df1.combineAdd(df2)
11824+
assert_frame_equal(comb, df3)
11825+
11826+
# mixed type GH2191
11827+
df1 = DataFrame({'A': [1, 2], 'B': [3, 4]})
11828+
df2 = DataFrame({'A': [1, 2], 'C': [5, 6]})
11829+
rs = df1.combineAdd(df2)
11830+
xp = DataFrame({'A': [2, 4], 'B': [3, 4.], 'C': [5, 6.]})
11831+
assert_frame_equal(xp, rs)
1183011832

1183111833
# TODO: test integer fill corner?
1183211834

1183311835
def test_combineMult(self):
11834-
# trivial
11835-
comb = self.frame.combineMult(self.frame)
1183611836

11837-
assert_frame_equal(comb, self.frame ** 2)
11837+
with tm.assert_produces_warning(FutureWarning):
11838+
# trivial
11839+
comb = self.frame.combineMult(self.frame)
1183811840

11839-
# corner cases
11840-
comb = self.frame.combineMult(self.empty)
11841-
assert_frame_equal(comb, self.frame)
11841+
assert_frame_equal(comb, self.frame ** 2)
1184211842

11843-
comb = self.empty.combineMult(self.frame)
11844-
assert_frame_equal(comb, self.frame)
11843+
# corner cases
11844+
comb = self.frame.combineMult(self.empty)
11845+
assert_frame_equal(comb, self.frame)
11846+
11847+
comb = self.empty.combineMult(self.frame)
11848+
assert_frame_equal(comb, self.frame)
1184511849

1184611850
def test_combine_generic(self):
1184711851
df1 = self.frame

0 commit comments

Comments
 (0)