Skip to content

Commit 4625d4d

Browse files
nbonnottejreback
authored andcommitted
BUG in numeric indexes preventing modulo operation, #9244
1 parent 707864a commit 4625d4d

File tree

3 files changed

+45
-20
lines changed

3 files changed

+45
-20
lines changed

doc/source/whatsnew/v0.18.0.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -504,6 +504,8 @@ Bug Fixes
504504

505505
- Bug in ``.to_csv`` ignoring formatting parameters ``decimal``, ``na_rep``, ``float_format`` for float indexes (:issue:`11553`)
506506

507+
- Bug in ``Int64Index`` and ``Float64Index`` preventing the use of the modulo operator (:issue:`9244`)
508+
507509
- Bug in ``DataFrame`` when masking an empty ``DataFrame`` (:issue:`11859`)
508510

509511
- Removed ``millisecond`` property of ``DatetimeIndex``. This would always raise

pandas/core/index.py

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3030,21 +3030,31 @@ def _evaluate_numeric_unary(self):
30303030

30313031
return _evaluate_numeric_unary
30323032

3033-
cls.__add__ = cls.__radd__ = _make_evaluate_binop(operator.add,'__add__')
3034-
cls.__sub__ = _make_evaluate_binop(operator.sub,'__sub__')
3035-
cls.__rsub__ = _make_evaluate_binop(operator.sub,'__sub__',reversed=True)
3036-
cls.__mul__ = cls.__rmul__ = _make_evaluate_binop(operator.mul,'__mul__')
3037-
cls.__floordiv__ = _make_evaluate_binop(operator.floordiv,'__floordiv__')
3038-
cls.__rfloordiv__ = _make_evaluate_binop(operator.floordiv,'__floordiv__',reversed=True)
3039-
cls.__truediv__ = _make_evaluate_binop(operator.truediv,'__truediv__')
3040-
cls.__rtruediv__ = _make_evaluate_binop(operator.truediv,'__truediv__',reversed=True)
3033+
cls.__add__ = cls.__radd__ = _make_evaluate_binop(
3034+
operator.add, '__add__')
3035+
cls.__sub__ = _make_evaluate_binop(operator.sub, '__sub__')
3036+
cls.__rsub__ = _make_evaluate_binop(
3037+
operator.sub, '__sub__', reversed=True)
3038+
cls.__mul__ = cls.__rmul__ = _make_evaluate_binop(
3039+
operator.mul, '__mul__')
3040+
cls.__mod__ = _make_evaluate_binop(operator.mod, '__mod__')
3041+
cls.__floordiv__ = _make_evaluate_binop(
3042+
operator.floordiv, '__floordiv__')
3043+
cls.__rfloordiv__ = _make_evaluate_binop(
3044+
operator.floordiv, '__floordiv__', reversed=True)
3045+
cls.__truediv__ = _make_evaluate_binop(
3046+
operator.truediv, '__truediv__')
3047+
cls.__rtruediv__ = _make_evaluate_binop(
3048+
operator.truediv, '__truediv__', reversed=True)
30413049
if not compat.PY3:
3042-
cls.__div__ = _make_evaluate_binop(operator.div,'__div__')
3043-
cls.__rdiv__ = _make_evaluate_binop(operator.div,'__div__',reversed=True)
3044-
cls.__neg__ = _make_evaluate_unary(lambda x: -x,'__neg__')
3045-
cls.__pos__ = _make_evaluate_unary(lambda x: x,'__pos__')
3046-
cls.__abs__ = _make_evaluate_unary(lambda x: np.abs(x),'__abs__')
3047-
cls.__inv__ = _make_evaluate_unary(lambda x: -x,'__inv__')
3050+
cls.__div__ = _make_evaluate_binop(
3051+
operator.div, '__div__')
3052+
cls.__rdiv__ = _make_evaluate_binop(
3053+
operator.div, '__div__', reversed=True)
3054+
cls.__neg__ = _make_evaluate_unary(lambda x: -x, '__neg__')
3055+
cls.__pos__ = _make_evaluate_unary(lambda x: x, '__pos__')
3056+
cls.__abs__ = _make_evaluate_unary(np.abs, '__abs__')
3057+
cls.__inv__ = _make_evaluate_unary(lambda x: -x, '__inv__')
30483058

30493059
@classmethod
30503060
def _add_logical_methods(cls):

pandas/tests/test_index.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2723,14 +2723,27 @@ def test_index_groupby(self):
27232723
self.assertEqual(idx.groupby(to_groupby),
27242724
{1.0: [idx[0], idx[5]], 2.0: [idx[1], idx[4]]})
27252725

2726-
to_groupby = Index([datetime(2011, 11, 1), datetime(2011, 12, 1),
2727-
pd.NaT, pd.NaT,
2728-
datetime(2011, 12, 1), datetime(2011, 11, 1)], tz='UTC').values
2729-
2730-
ex_keys = pd.tslib.datetime_to_datetime64(np.array([Timestamp('2011-11-01'), Timestamp('2011-12-01')]))
2731-
expected = {ex_keys[0][0]: [idx[0], idx[5]], ex_keys[0][1]: [idx[1], idx[4]]}
2726+
to_groupby = Index([datetime(2011, 11, 1),
2727+
datetime(2011, 12, 1),
2728+
pd.NaT,
2729+
pd.NaT,
2730+
datetime(2011, 12, 1),
2731+
datetime(2011, 11, 1)],
2732+
tz='UTC').values
2733+
2734+
ex_keys = pd.tslib.datetime_to_datetime64(
2735+
np.array([Timestamp('2011-11-01'),
2736+
Timestamp('2011-12-01')]))
2737+
expected = {ex_keys[0][0]: [idx[0], idx[5]],
2738+
ex_keys[0][1]: [idx[1], idx[4]]}
27322739
self.assertEqual(idx.groupby(to_groupby), expected)
27332740

2741+
def test_modulo(self):
2742+
# GH 9244
2743+
index = self.create_index()
2744+
expected = Index(index.values % 2)
2745+
self.assert_index_equal(index % 2, expected)
2746+
27342747

27352748
class TestFloat64Index(Numeric, tm.TestCase):
27362749
_holder = Float64Index

0 commit comments

Comments
 (0)