diff --git a/doc/source/whatsnew/v3.0.0.rst b/doc/source/whatsnew/v3.0.0.rst index cd6977f43d322..1146d7fb1ae4a 100644 --- a/doc/source/whatsnew/v3.0.0.rst +++ b/doc/source/whatsnew/v3.0.0.rst @@ -281,6 +281,7 @@ Bug fixes - Fixed bug in :meth:`DataFrame.to_string` that raised ``StopIteration`` with nested DataFrames. (:issue:`16098`) - Fixed bug in :meth:`DataFrame.update` bool dtype being converted to object (:issue:`55509`) - Fixed bug in :meth:`Series.diff` allowing non-integer values for the ``periods`` argument. (:issue:`56607`) +- Fixed bug in :meth:`Series.rank` that doesn't preserve missing values for nullable integers when ``na_option='keep'``. (:issue:`56976`) Categorical ^^^^^^^^^^^ diff --git a/pandas/core/arrays/base.py b/pandas/core/arrays/base.py index 399be217af9d1..86831f072bb8f 100644 --- a/pandas/core/arrays/base.py +++ b/pandas/core/arrays/base.py @@ -2206,7 +2206,7 @@ def _rank( raise NotImplementedError return rank( - self._values_for_argsort(), + self, axis=axis, method=method, na_option=na_option, diff --git a/pandas/tests/series/methods/test_rank.py b/pandas/tests/series/methods/test_rank.py index 776c5633cb4b3..2d7fde130ce70 100644 --- a/pandas/tests/series/methods/test_rank.py +++ b/pandas/tests/series/methods/test_rank.py @@ -234,6 +234,16 @@ def test_rank_categorical(self): tm.assert_series_equal(na_ser.rank(na_option="bottom", pct=True), exp_bot) tm.assert_series_equal(na_ser.rank(na_option="keep", pct=True), exp_keep) + def test_rank_nullable_integer(self): + # GH 56976 + exp = Series([np.nan, 2, np.nan, 3, 3, 2, 3, 1]) + exp = exp.astype("Int64") + result = exp.rank(na_option="keep") + + expected = Series([np.nan, 2.5, np.nan, 5.0, 5.0, 2.5, 5.0, 1.0]) + + tm.assert_series_equal(result, expected) + def test_rank_signature(self): s = Series([0, 1]) s.rank(method="average")