From 63701c4479c45b1912d662eecea6d14dc98ce388 Mon Sep 17 00:00:00 2001 From: Daniel Saxton Date: Tue, 9 Mar 2021 08:21:30 -0600 Subject: [PATCH 1/4] BUG: Fix sort_values for empty by argument --- doc/source/whatsnew/v1.2.4.rst | 2 +- pandas/core/frame.py | 4 +++- pandas/tests/frame/methods/test_sort_values.py | 4 ++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/doc/source/whatsnew/v1.2.4.rst b/doc/source/whatsnew/v1.2.4.rst index edf23bf89d7e1..531ec32e7e735 100644 --- a/doc/source/whatsnew/v1.2.4.rst +++ b/doc/source/whatsnew/v1.2.4.rst @@ -25,7 +25,7 @@ Fixed regressions Bug fixes ~~~~~~~~~ -- +- Fixed bug in :meth:`DataFrame.sort_values` raising an :class:`IndexError` for empty ``by`` (:issue:`40258`) - .. --------------------------------------------------------------------------- diff --git a/pandas/core/frame.py b/pandas/core/frame.py index dbf2446f43af3..a6953d21f60fc 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -5818,7 +5818,7 @@ def sort_values( # type: ignore[override] keys, orders=ascending, na_position=na_position, key=key ) indexer = ensure_platform_int(indexer) - else: + elif len(by): by = by[0] k = self._get_label_or_level_values(by, axis=axis) @@ -5833,6 +5833,8 @@ def sort_values( # type: ignore[override] indexer = nargsort( k, kind=kind, ascending=ascending, na_position=na_position, key=key ) + else: + return self new_data = self._mgr.take( indexer, axis=self._get_block_manager_axis(axis), verify=False diff --git a/pandas/tests/frame/methods/test_sort_values.py b/pandas/tests/frame/methods/test_sort_values.py index eaea22df3adfe..a47447171ce40 100644 --- a/pandas/tests/frame/methods/test_sort_values.py +++ b/pandas/tests/frame/methods/test_sort_values.py @@ -79,6 +79,10 @@ def test_sort_values(self): with pytest.raises(ValueError, match=msg): frame.sort_values(by=["A", "B"], axis=0, ascending=[True] * 5) + # https://github.com/pandas-dev/pandas/issues/40258 + sorted_df = frame.sort_values(by=[]) + tm.assert_frame_equal(sorted_df, frame) + def test_sort_values_inplace(self): frame = DataFrame( np.random.randn(4, 4), index=[1, 2, 3, 4], columns=["A", "B", "C", "D"] From aee6cb95e8b01aafe48633d01f4a2149d1fe1ccf Mon Sep 17 00:00:00 2001 From: Daniel Saxton Date: Tue, 9 Mar 2021 11:54:46 -0600 Subject: [PATCH 2/4] Copy --- pandas/core/frame.py | 2 +- pandas/tests/frame/methods/test_sort_values.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/pandas/core/frame.py b/pandas/core/frame.py index a6953d21f60fc..64759dcf07d8b 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -5834,7 +5834,7 @@ def sort_values( # type: ignore[override] k, kind=kind, ascending=ascending, na_position=na_position, key=key ) else: - return self + return self.copy() new_data = self._mgr.take( indexer, axis=self._get_block_manager_axis(axis), verify=False diff --git a/pandas/tests/frame/methods/test_sort_values.py b/pandas/tests/frame/methods/test_sort_values.py index a47447171ce40..bda61f1843477 100644 --- a/pandas/tests/frame/methods/test_sort_values.py +++ b/pandas/tests/frame/methods/test_sort_values.py @@ -82,6 +82,7 @@ def test_sort_values(self): # https://github.com/pandas-dev/pandas/issues/40258 sorted_df = frame.sort_values(by=[]) tm.assert_frame_equal(sorted_df, frame) + assert sorted_df is not frame def test_sort_values_inplace(self): frame = DataFrame( From 16d144f24085fd2ce0878bbe17eb8dbabac5a5f9 Mon Sep 17 00:00:00 2001 From: Daniel Saxton Date: Tue, 9 Mar 2021 14:20:54 -0600 Subject: [PATCH 3/4] Move whatsnew --- doc/source/whatsnew/v1.2.4.rst | 2 +- doc/source/whatsnew/v1.3.0.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/source/whatsnew/v1.2.4.rst b/doc/source/whatsnew/v1.2.4.rst index 531ec32e7e735..edf23bf89d7e1 100644 --- a/doc/source/whatsnew/v1.2.4.rst +++ b/doc/source/whatsnew/v1.2.4.rst @@ -25,7 +25,7 @@ Fixed regressions Bug fixes ~~~~~~~~~ -- Fixed bug in :meth:`DataFrame.sort_values` raising an :class:`IndexError` for empty ``by`` (:issue:`40258`) +- - .. --------------------------------------------------------------------------- diff --git a/doc/source/whatsnew/v1.3.0.rst b/doc/source/whatsnew/v1.3.0.rst index ac5ad12a992b7..42396d920c3bd 100644 --- a/doc/source/whatsnew/v1.3.0.rst +++ b/doc/source/whatsnew/v1.3.0.rst @@ -437,6 +437,7 @@ Timezones Numeric ^^^^^^^ - Bug in :meth:`DataFrame.quantile`, :meth:`DataFrame.sort_values` causing incorrect subsequent indexing behavior (:issue:`38351`) +- Bug in :meth:`DataFrame.sort_values` raising an :class:`IndexError` for empty ``by`` (:issue:`40258`) - Bug in :meth:`DataFrame.select_dtypes` with ``include=np.number`` now retains numeric ``ExtensionDtype`` columns (:issue:`35340`) - Bug in :meth:`DataFrame.mode` and :meth:`Series.mode` not keeping consistent integer :class:`Index` for empty input (:issue:`33321`) - Bug in :meth:`DataFrame.rank` with ``np.inf`` and mixture of ``np.nan`` and ``np.inf`` (:issue:`32593`) From 0aa5005cfdef693d34ba53f5908c3b13bfee299b Mon Sep 17 00:00:00 2001 From: Daniel Saxton Date: Tue, 9 Mar 2021 14:25:46 -0600 Subject: [PATCH 4/4] New test --- pandas/tests/frame/methods/test_sort_values.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pandas/tests/frame/methods/test_sort_values.py b/pandas/tests/frame/methods/test_sort_values.py index bda61f1843477..2ca5f6aa72241 100644 --- a/pandas/tests/frame/methods/test_sort_values.py +++ b/pandas/tests/frame/methods/test_sort_values.py @@ -79,10 +79,12 @@ def test_sort_values(self): with pytest.raises(ValueError, match=msg): frame.sort_values(by=["A", "B"], axis=0, ascending=[True] * 5) + def test_sort_values_by_empty_list(self): # https://github.com/pandas-dev/pandas/issues/40258 - sorted_df = frame.sort_values(by=[]) - tm.assert_frame_equal(sorted_df, frame) - assert sorted_df is not frame + expected = DataFrame({"a": [1, 4, 2, 5, 3, 6]}) + result = expected.sort_values(by=[]) + tm.assert_frame_equal(result, expected) + assert result is not expected def test_sort_values_inplace(self): frame = DataFrame(