From 93987126025985324478307e165fb68a71171574 Mon Sep 17 00:00:00 2001 From: Marco Gorelli Date: Sun, 16 May 2021 13:33:48 +0100 Subject: [PATCH 1/3] deprecate positional args in sort_index --- doc/source/whatsnew/v1.3.0.rst | 1 + pandas/core/frame.py | 2 ++ pandas/core/series.py | 2 ++ pandas/tests/frame/methods/test_sort_index.py | 10 ++++++++++ pandas/tests/indexing/test_loc.py | 4 ++-- pandas/tests/series/methods/test_sort_index.py | 10 ++++++++++ 6 files changed, 27 insertions(+), 2 deletions(-) diff --git a/doc/source/whatsnew/v1.3.0.rst b/doc/source/whatsnew/v1.3.0.rst index 622029adf357f..de796a8ef192a 100644 --- a/doc/source/whatsnew/v1.3.0.rst +++ b/doc/source/whatsnew/v1.3.0.rst @@ -647,6 +647,7 @@ Deprecations - Deprecated setting :attr:`Categorical._codes`, create a new :class:`Categorical` with the desired codes instead (:issue:`40606`) - Deprecated behavior of :meth:`DatetimeIndex.union` with mixed timezones; in a future version both will be cast to UTC instead of object dtype (:issue:`39328`) - Deprecated using ``usecols`` with out of bounds indices for ``read_csv`` with ``engine="c"`` (:issue:`25623`) +- Deprecated passing arguments as positional in :meth:`DataFrame.sort_index` and :meth:`Series.sort_index` (:issue:`41485`) .. --------------------------------------------------------------------------- diff --git a/pandas/core/frame.py b/pandas/core/frame.py index 2941b6ac01904..47f37aa554048 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -77,6 +77,7 @@ Appender, Substitution, deprecate_kwarg, + deprecate_nonkeyword_arguments, doc, rewrite_axis_style_signature, ) @@ -6262,6 +6263,7 @@ def sort_values( # type: ignore[override] else: return result.__finalize__(self, method="sort_values") + @deprecate_nonkeyword_arguments(version="2.0", allowed_args=["self"]) def sort_index( self, axis: Axis = 0, diff --git a/pandas/core/series.py b/pandas/core/series.py index c8e9898f9462a..d3567cf4a54c1 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -51,6 +51,7 @@ from pandas.util._decorators import ( Appender, Substitution, + deprecate_nonkeyword_arguments, doc, ) from pandas.util._validators import ( @@ -3434,6 +3435,7 @@ def sort_values( else: return result.__finalize__(self, method="sort_values") + @deprecate_nonkeyword_arguments(version="2.0", allowed_args=["self"]) def sort_index( self, axis=0, diff --git a/pandas/tests/frame/methods/test_sort_index.py b/pandas/tests/frame/methods/test_sort_index.py index a04ed7e92478f..6197ef147ffff 100644 --- a/pandas/tests/frame/methods/test_sort_index.py +++ b/pandas/tests/frame/methods/test_sort_index.py @@ -867,3 +867,13 @@ def test_sort_index_multiindex_sparse_column(self): result = expected.sort_index(level=0) tm.assert_frame_equal(result, expected) + + def test_sort_index_pos_args_deprecation(self): + # https://github.com/pandas-dev/pandas/issues/41485 + df = DataFrame({"a": [1, 2, 3]}) + msg = ( + r"Starting with Pandas version 2\.0 all arguments of sort_index " + r"except for the argument 'self' will be keyword-only" + ) + with tm.assert_produces_warning(FutureWarning, match=msg): + df.sort_index(1) diff --git a/pandas/tests/indexing/test_loc.py b/pandas/tests/indexing/test_loc.py index 90e3ff29977ae..e2076a6d6afaa 100644 --- a/pandas/tests/indexing/test_loc.py +++ b/pandas/tests/indexing/test_loc.py @@ -1352,9 +1352,9 @@ def test_loc_setitem_unsorted_multiindex_columns(self, key): expected = DataFrame([[0, 2, 0], [0, 5, 0]], columns=mi) tm.assert_frame_equal(obj, expected) - df = df.sort_index(1) + df = df.sort_index(axis=1) df.loc[:, key] = np.zeros((2, 2), dtype=int) - expected = expected.sort_index(1) + expected = expected.sort_index(axis=1) tm.assert_frame_equal(df, expected) def test_loc_setitem_uint_drop(self, any_int_dtype): diff --git a/pandas/tests/series/methods/test_sort_index.py b/pandas/tests/series/methods/test_sort_index.py index 4df6f52e0fff4..7962e8091809f 100644 --- a/pandas/tests/series/methods/test_sort_index.py +++ b/pandas/tests/series/methods/test_sort_index.py @@ -320,3 +320,13 @@ def test_sort_values_key_type(self): result = s.sort_index(key=lambda x: x.month_name()) expected = s.iloc[[2, 1, 0]] tm.assert_series_equal(result, expected) + + def test_sort_index_pos_args_deprecation(self): + # https://github.com/pandas-dev/pandas/issues/41485 + ser = Series([1, 2, 3]) + msg = ( + r"Starting with Pandas version 2\.0 all arguments of sort_index " + r"except for the argument 'self' will be keyword-only" + ) + with tm.assert_produces_warning(FutureWarning, match=msg): + ser.sort_index(0) From 66f3ec82c9ff518b7589ad0fb5d47fda19dc7721 Mon Sep 17 00:00:00 2001 From: Marco Gorelli Date: Tue, 18 May 2021 21:56:47 +0100 Subject: [PATCH 2/3] fixup post merge --- pandas/core/frame.py | 2 +- pandas/core/series.py | 2 +- pandas/tests/frame/methods/test_sort_index.py | 8 +++++--- pandas/tests/series/methods/test_sort_index.py | 8 +++++--- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/pandas/core/frame.py b/pandas/core/frame.py index 00c8cc79fc1a8..8bee6be1bacb9 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -6301,7 +6301,7 @@ def sort_values( # type: ignore[override] else: return result.__finalize__(self, method="sort_values") - @deprecate_nonkeyword_arguments(version="2.0", allowed_args=["self"]) + @deprecate_nonkeyword_arguments(version=None, allowed_args=["self"]) def sort_index( self, axis: Axis = 0, diff --git a/pandas/core/series.py b/pandas/core/series.py index 3419d3364791c..78a0f451a24eb 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -3435,7 +3435,7 @@ def sort_values( else: return result.__finalize__(self, method="sort_values") - @deprecate_nonkeyword_arguments(version="2.0", allowed_args=["self"]) + @deprecate_nonkeyword_arguments(version=None, allowed_args=["self"]) def sort_index( self, axis=0, diff --git a/pandas/tests/frame/methods/test_sort_index.py b/pandas/tests/frame/methods/test_sort_index.py index 6197ef147ffff..dbb6bb116828a 100644 --- a/pandas/tests/frame/methods/test_sort_index.py +++ b/pandas/tests/frame/methods/test_sort_index.py @@ -872,8 +872,10 @@ def test_sort_index_pos_args_deprecation(self): # https://github.com/pandas-dev/pandas/issues/41485 df = DataFrame({"a": [1, 2, 3]}) msg = ( - r"Starting with Pandas version 2\.0 all arguments of sort_index " - r"except for the argument 'self' will be keyword-only" + r"In a future version of pandas all arguments of DataFrame.sort_index " + r"will be keyword-only" ) with tm.assert_produces_warning(FutureWarning, match=msg): - df.sort_index(1) + result = df.sort_index(1) + expected = DataFrame({"a": [1, 2, 3]}) + tm.assert_frame_equal(result, expected) diff --git a/pandas/tests/series/methods/test_sort_index.py b/pandas/tests/series/methods/test_sort_index.py index 7962e8091809f..d7bd92c673e69 100644 --- a/pandas/tests/series/methods/test_sort_index.py +++ b/pandas/tests/series/methods/test_sort_index.py @@ -325,8 +325,10 @@ def test_sort_index_pos_args_deprecation(self): # https://github.com/pandas-dev/pandas/issues/41485 ser = Series([1, 2, 3]) msg = ( - r"Starting with Pandas version 2\.0 all arguments of sort_index " - r"except for the argument 'self' will be keyword-only" + r"In a future version of pandas all arguments of Series.sort_index " + r"will be keyword-only" ) with tm.assert_produces_warning(FutureWarning, match=msg): - ser.sort_index(0) + result = ser.sort_index(0) + expected = Series([1, 2, 3]) + tm.assert_series_equal(result, expected) From f1981157b6a297f1458b0aa651d086d894e4fc35 Mon Sep 17 00:00:00 2001 From: Marco Gorelli Date: Sun, 23 May 2021 21:28:50 +0100 Subject: [PATCH 3/3] fixup user guide usage --- doc/source/user_guide/io.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/user_guide/io.rst b/doc/source/user_guide/io.rst index 7f0cd613726dc..13f430b19e8e1 100644 --- a/doc/source/user_guide/io.rst +++ b/doc/source/user_guide/io.rst @@ -1896,7 +1896,7 @@ Writing in ISO date format: dfd = pd.DataFrame(np.random.randn(5, 2), columns=list("AB")) dfd["date"] = pd.Timestamp("20130101") - dfd = dfd.sort_index(1, ascending=False) + dfd = dfd.sort_index(axis=1, ascending=False) json = dfd.to_json(date_format="iso") json