Skip to content

Commit e884a69

Browse files
committed
Fix Index mul/div ops with Series, closes pandas-dev#19080, pandas-dev#19042
1 parent aa9e002 commit e884a69

File tree

4 files changed

+29
-19
lines changed

4 files changed

+29
-19
lines changed

pandas/core/indexes/base.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from pandas import compat
1414

1515
from pandas.core.dtypes.generic import (
16-
ABCSeries,
16+
ABCSeries, ABCDataFrame,
1717
ABCMultiIndex,
1818
ABCPeriodIndex,
1919
ABCDateOffset)
@@ -4020,6 +4020,9 @@ def _add_numeric_methods_binary(cls):
40204020

40214021
def _make_evaluate_binop(op, opstr, reversed=False, constructor=Index):
40224022
def _evaluate_numeric_binop(self, other):
4023+
if isinstance(other, (ABCSeries, ABCDataFrame)):
4024+
return NotImplemented
4025+
40234026
other = self._validate_for_numeric_binop(other, op, opstr)
40244027

40254028
# handle time-based others

pandas/core/indexes/range.py

+3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
is_integer,
99
is_scalar,
1010
is_int64_dtype)
11+
from pandas.core.dtypes.generic import ABCSeries
1112

1213
from pandas import compat
1314
from pandas.compat import lrange, range, get_range_parameters
@@ -583,6 +584,8 @@ def _make_evaluate_binop(op, opstr, reversed=False, step=False):
583584
"""
584585

585586
def _evaluate_numeric_binop(self, other):
587+
if isinstance(other, ABCSeries):
588+
return NotImplemented
586589

587590
other = self._validate_for_numeric_binop(other, op, opstr)
588591
attrs = self._get_attributes_dict()

pandas/tests/indexes/test_numeric.py

+17-14
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,12 @@ def test_numeric_compat(self):
6868
tm.assert_index_equal(result, didx)
6969

7070
result = idx * Series(np.arange(5, dtype=arr_dtype))
71-
tm.assert_index_equal(result, didx)
71+
tm.assert_series_equal(result, Series(didx))
7272

73-
result = idx * Series(np.arange(5, dtype='float64') + 0.1)
74-
expected = Float64Index(np.arange(5, dtype='float64') *
75-
(np.arange(5, dtype='float64') + 0.1))
76-
tm.assert_index_equal(result, expected)
73+
rng5 = np.arange(5, dtype='float64')
74+
result = idx * Series(rng5 + 0.1)
75+
expected = Series(rng5 * (rng5 + 0.1))
76+
tm.assert_series_equal(result, expected)
7777

7878
# invalid
7979
pytest.raises(TypeError,
@@ -95,15 +95,6 @@ def test_numeric_compat(self):
9595
for r, e in zip(result, expected):
9696
tm.assert_index_equal(r, e)
9797

98-
result = divmod(idx, Series(full_like(idx.values, 2)))
99-
with np.errstate(all='ignore'):
100-
div, mod = divmod(
101-
idx.values,
102-
full_like(idx.values, 2),
103-
)
104-
expected = Index(div), Index(mod)
105-
for r, e in zip(result, expected):
106-
tm.assert_index_equal(r, e)
10798

10899
# test power calculations both ways, GH 14973
109100
expected = pd.Float64Index(2.0**idx.values)
@@ -114,6 +105,18 @@ def test_numeric_compat(self):
114105
result = idx**2.0
115106
tm.assert_index_equal(result, expected)
116107

108+
@pytest.mark.xfail(reason='GH#19252 Series has no __rdivmod__')
109+
def test_divmod_series(self):
110+
idx = self.create_index()
111+
112+
result = divmod(idx, Series(full_like(idx.values, 2)))
113+
with np.errstate(all='ignore'):
114+
div, mod = divmod(idx.values, full_like(idx.values, 2))
115+
expected = Series(div), Series(mod)
116+
117+
for r, e in zip(result, expected):
118+
tm.assert_series_equal(r, e)
119+
117120
def test_explicit_conversions(self):
118121

119122
# GH 8608

pandas/tests/indexes/timedeltas/test_arithmetic.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -152,11 +152,12 @@ def test_numeric_compat(self):
152152
tm.assert_index_equal(result, didx)
153153

154154
result = idx * Series(np.arange(5, dtype='int64'))
155-
tm.assert_index_equal(result, didx)
155+
tm.assert_series_equal(result, Series(didx))
156156

157-
result = idx * Series(np.arange(5, dtype='float64') + 0.1)
158-
tm.assert_index_equal(result, self._holder(np.arange(
159-
5, dtype='float64') * (np.arange(5, dtype='float64') + 0.1)))
157+
rng5 = np.arange(5, dtype='float64')
158+
result = idx * Series(rng5 + 0.1)
159+
tm.assert_series_equal(result,
160+
Series(self._holder(rng5 * (rng5 + 0.1))))
160161

161162
# invalid
162163
pytest.raises(TypeError, lambda: idx * idx)

0 commit comments

Comments
 (0)