From 46a714d7c04d9a2070e662ddc120f1d7c54a0f50 Mon Sep 17 00:00:00 2001 From: KalyanGokhale <4734245+KalyanGokhale@users.noreply.github.com> Date: Thu, 24 May 2018 23:49:48 +0530 Subject: [PATCH 1/5] Initial commit GH21149-2 --- doc/source/whatsnew/v0.23.1.txt | 3 ++- pandas/core/indexes/base.py | 3 ++- pandas/tests/indexes/test_multi.py | 12 ++++++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/doc/source/whatsnew/v0.23.1.txt b/doc/source/whatsnew/v0.23.1.txt index a071d7f3f5534..81e4595d2fa82 100644 --- a/doc/source/whatsnew/v0.23.1.txt +++ b/doc/source/whatsnew/v0.23.1.txt @@ -78,7 +78,8 @@ Indexing - Bug in :meth:`Series.reset_index` where appropriate error was not raised with an invalid level name (:issue:`20925`) - Bug in :func:`interval_range` when ``start``/``periods`` or ``end``/``periods`` are specified with float ``start`` or ``end`` (:issue:`21161`) -- +- Bug in :meth:`MultiIndex.set_names` where error was raised for a MultiIndex with self.nlevels == 1 (:issue:`21149`) +- I/O ^^^ diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index f79288c167356..25d4e1be983e7 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -1384,7 +1384,8 @@ def set_names(self, names, level=None, inplace=False): names=[u'baz', u'bar']) """ - if level is not None and self.nlevels == 1: + from .multi import MultiIndex + if level is not None and not isinstance(self, MultiIndex): raise ValueError('Level must be None for non-MultiIndex') if level is not None and not is_list_like(level) and is_list_like( diff --git a/pandas/tests/indexes/test_multi.py b/pandas/tests/indexes/test_multi.py index c9f6bc9151d00..8dccb95977a1b 100644 --- a/pandas/tests/indexes/test_multi.py +++ b/pandas/tests/indexes/test_multi.py @@ -165,6 +165,18 @@ def test_set_name_methods(self): assert res is None assert ind.names == new_names2 + def test_multiindex_set_names(self): + # GH 21149 + '''Ensure that .set_names for MultiIndex with + nlevels == 1 does not raise any errors + ''' + result = pd.MultiIndex.from_product([[0, 1]]) + result.set_names('first', level=0, inplace=True) + expected = pd.MultiIndex(levels=[[0, 1]], + labels=[[0, 1]], + names=['first']) + tm.assert_index_equal(result, expected) + def test_set_levels_labels_directly(self): # setting levels/labels directly raises AttributeError From 6ce4b1fb37e54297129f696b04259f9fed04c5e0 Mon Sep 17 00:00:00 2001 From: Kalyan Gokhale <4734245+KalyanGokhale@users.noreply.github.com> Date: Fri, 25 May 2018 00:52:10 +0530 Subject: [PATCH 2/5] Update v0.23.1.txt --- doc/source/whatsnew/v0.23.1.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/whatsnew/v0.23.1.txt b/doc/source/whatsnew/v0.23.1.txt index 81e4595d2fa82..cc776eb19549d 100644 --- a/doc/source/whatsnew/v0.23.1.txt +++ b/doc/source/whatsnew/v0.23.1.txt @@ -78,7 +78,7 @@ Indexing - Bug in :meth:`Series.reset_index` where appropriate error was not raised with an invalid level name (:issue:`20925`) - Bug in :func:`interval_range` when ``start``/``periods`` or ``end``/``periods`` are specified with float ``start`` or ``end`` (:issue:`21161`) -- Bug in :meth:`MultiIndex.set_names` where error was raised for a MultiIndex with self.nlevels == 1 (:issue:`21149`) +- Bug in :meth:`MultiIndex.set_names` where error raised for a MultiIndex with self.nlevels == 1 (:issue:`21149`) - I/O From da6d530d538387215a3c282d170458370ddb5d1b Mon Sep 17 00:00:00 2001 From: Kalyan Gokhale <4734245+KalyanGokhale@users.noreply.github.com> Date: Fri, 25 May 2018 21:55:45 +0530 Subject: [PATCH 3/5] Update v0.23.1.txt --- doc/source/whatsnew/v0.23.1.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/whatsnew/v0.23.1.txt b/doc/source/whatsnew/v0.23.1.txt index cc776eb19549d..47878b5e32819 100644 --- a/doc/source/whatsnew/v0.23.1.txt +++ b/doc/source/whatsnew/v0.23.1.txt @@ -78,7 +78,7 @@ Indexing - Bug in :meth:`Series.reset_index` where appropriate error was not raised with an invalid level name (:issue:`20925`) - Bug in :func:`interval_range` when ``start``/``periods`` or ``end``/``periods`` are specified with float ``start`` or ``end`` (:issue:`21161`) -- Bug in :meth:`MultiIndex.set_names` where error raised for a MultiIndex with self.nlevels == 1 (:issue:`21149`) +- Bug in :meth:`MultiIndex.set_names` where error raised for a ``MultiIndex`` with ``nlevels == 1`` (:issue:`21149`) - I/O From 6f65c994a444254a1477db16c393d2b1c9fcceb1 Mon Sep 17 00:00:00 2001 From: Kalyan Gokhale <4734245+KalyanGokhale@users.noreply.github.com> Date: Fri, 25 May 2018 21:59:23 +0530 Subject: [PATCH 4/5] Update test_multi.py --- pandas/tests/indexes/test_multi.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/pandas/tests/indexes/test_multi.py b/pandas/tests/indexes/test_multi.py index 8dccb95977a1b..80578b980f94b 100644 --- a/pandas/tests/indexes/test_multi.py +++ b/pandas/tests/indexes/test_multi.py @@ -165,16 +165,20 @@ def test_set_name_methods(self): assert res is None assert ind.names == new_names2 - def test_multiindex_set_names(self): + @pytest.mark.parametrize('inplace_flg,expected_out', [ + (True, pd.MultiIndex(levels=[[0, 1]], + labels=[[0, 1]], + names=['first'])), + (False, pd.MultiIndex(levels=[[0, 1]], + labels=[[0, 1]]))]) + def test_multiindex_set_names(self, inplace_flg, expected_out): # GH 21149 - '''Ensure that .set_names for MultiIndex with + """ Ensure that .set_names for MultiIndex with nlevels == 1 does not raise any errors - ''' + """ result = pd.MultiIndex.from_product([[0, 1]]) - result.set_names('first', level=0, inplace=True) - expected = pd.MultiIndex(levels=[[0, 1]], - labels=[[0, 1]], - names=['first']) + result.set_names('first', level=0, inplace=inplace_flg) + expected = expected_out tm.assert_index_equal(result, expected) def test_set_levels_labels_directly(self): From 20fb29294d6df319f118ae086d27d58ba0c84e55 Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Mon, 28 May 2018 21:28:13 -0400 Subject: [PATCH 5/5] clean tests --- doc/source/whatsnew/v0.23.1.txt | 2 +- pandas/tests/indexes/test_multi.py | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/doc/source/whatsnew/v0.23.1.txt b/doc/source/whatsnew/v0.23.1.txt index 49e7cf93e4fe6..fc6f3f3bfa614 100644 --- a/doc/source/whatsnew/v0.23.1.txt +++ b/doc/source/whatsnew/v0.23.1.txt @@ -81,7 +81,7 @@ Indexing - Bug in :meth:`Series.reset_index` where appropriate error was not raised with an invalid level name (:issue:`20925`) - Bug in :func:`interval_range` when ``start``/``periods`` or ``end``/``periods`` are specified with float ``start`` or ``end`` (:issue:`21161`) - Bug in :meth:`MultiIndex.set_names` where error raised for a ``MultiIndex`` with ``nlevels == 1`` (:issue:`21149`) -- +- I/O ^^^ diff --git a/pandas/tests/indexes/test_multi.py b/pandas/tests/indexes/test_multi.py index 80578b980f94b..0ab3447909d9b 100644 --- a/pandas/tests/indexes/test_multi.py +++ b/pandas/tests/indexes/test_multi.py @@ -165,20 +165,20 @@ def test_set_name_methods(self): assert res is None assert ind.names == new_names2 - @pytest.mark.parametrize('inplace_flg,expected_out', [ - (True, pd.MultiIndex(levels=[[0, 1]], - labels=[[0, 1]], - names=['first'])), - (False, pd.MultiIndex(levels=[[0, 1]], - labels=[[0, 1]]))]) - def test_multiindex_set_names(self, inplace_flg, expected_out): + @pytest.mark.parametrize('inplace', [True, False]) + def test_set_names_with_nlevel_1(self, inplace): # GH 21149 - """ Ensure that .set_names for MultiIndex with - nlevels == 1 does not raise any errors - """ - result = pd.MultiIndex.from_product([[0, 1]]) - result.set_names('first', level=0, inplace=inplace_flg) - expected = expected_out + # Ensure that .set_names for MultiIndex with + # nlevels == 1 does not raise any errors + expected = pd.MultiIndex(levels=[[0, 1]], + labels=[[0, 1]], + names=['first']) + m = pd.MultiIndex.from_product([[0, 1]]) + result = m.set_names('first', level=0, inplace=inplace) + + if inplace: + result = m + tm.assert_index_equal(result, expected) def test_set_levels_labels_directly(self):