diff --git a/pandas/core/index.py b/pandas/core/index.py index 8b650fea9b440..bd56bf9808eb9 100644 --- a/pandas/core/index.py +++ b/pandas/core/index.py @@ -2531,7 +2531,7 @@ def _evaluate_numeric_binop(self, other): if reversed: values, other = other, values - return self._shallow_copy(op(values, other)) + return Index(op(values, other), **self._get_attributes_dict()) return _evaluate_numeric_binop diff --git a/pandas/tests/test_index.py b/pandas/tests/test_index.py index 3c9dbd2e48cb6..9f84f5db2a3c9 100644 --- a/pandas/tests/test_index.py +++ b/pandas/tests/test_index.py @@ -1909,6 +1909,46 @@ def test_astype(self): self.assertTrue(i.equals(result)) self.check_is_index(result) + def test_promote_type(self): + # GH-9966 + index_int = Int64Index(np.arange(5)) + operators = (operator.add, + operator.sub, + operator.mul, + operator.truediv, + operator.floordiv) + for op in operators: + index_promoted = op(index_int, np.pi) + self.assertEqual(index_promoted.dtype, np.float64) + self.assertIsInstance(index_promoted, Float64Index) + + def test_promote_type_inplace(self): + # Related to GH-9966 + index = Int64Index(np.arange(5)) + index += np.pi + self.assertEqual(index.dtype, np.float64) + self.assertIsInstance(index, Float64Index) + + index = Int64Index(np.arange(5)) + index -= np.pi + self.assertEqual(index.dtype, np.float64) + self.assertIsInstance(index, Float64Index) + + index = Int64Index(np.arange(5)) + index *= np.pi + self.assertEqual(index.dtype, np.float64) + self.assertIsInstance(index, Float64Index) + + index = Int64Index(np.arange(5)) + index /= np.pi + self.assertEqual(index.dtype, np.float64) + self.assertIsInstance(index, Float64Index) + + index = Int64Index(np.arange(5)) + index //= np.pi + self.assertEqual(index.dtype, np.float64) + self.assertIsInstance(index, Float64Index) + def test_equals(self): i = Float64Index([1.0,2.0])