From 40ecf6e754451acb87f8a2f3b911a8cb9728cda1 Mon Sep 17 00:00:00 2001 From: Marco Gorelli Date: Fri, 16 Apr 2021 15:07:23 +0100 Subject: [PATCH 1/7] make rename compatible with parent --- pandas/core/groupby/groupby.py | 3 ++- pandas/core/series.py | 20 ++++++++++++++------ pandas/tests/series/methods/test_rename.py | 13 +++++++++++++ 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/pandas/core/groupby/groupby.py b/pandas/core/groupby/groupby.py index 43db889618db6..184043afbe0c8 100644 --- a/pandas/core/groupby/groupby.py +++ b/pandas/core/groupby/groupby.py @@ -28,6 +28,7 @@ class providing the base-class of operations. Sequence, TypeVar, Union, + cast, ) import numpy as np @@ -1698,7 +1699,7 @@ def size(self) -> FrameOrSeriesUnion: result = self._obj_1d_constructor(result) if not self.as_index: - result = result.rename("size").reset_index() + result = cast(Series, result.rename("size")).reset_index() return self._reindex_output(result, fill_value=0) diff --git a/pandas/core/series.py b/pandas/core/series.py index 5c605a6b441c6..b14c209e02a7e 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -4345,14 +4345,16 @@ def align( def rename( self, - index=None, + mapper=None, *, + index=None, + columns=None, axis=None, copy=True, inplace=False, level=None, errors="ignore", - ): + ) -> Series | None: """ Alter Series index labels or name. @@ -4368,7 +4370,7 @@ def rename( ---------- axis : {0 or "index"} Unused. Accepted for compatibility with DataFrame method only. - index : scalar, hashable sequence, dict-like or function, optional + mapper : scalar, hashable sequence, dict-like or function, optional Functions or dict-like are transformations to apply to the index. Scalar or hashable sequence-like will alter the ``Series.name`` @@ -4412,12 +4414,18 @@ def rename( 5 3 dtype: int64 """ - if callable(index) or is_dict_like(index): + if index is not None and mapper is not None: + raise TypeError("Cannot specify both 'mapper' and 'index'") + if index is None and mapper is None: + raise TypeError("Must pass a mapper") + if mapper is None: + mapper = index + if callable(mapper) or is_dict_like(mapper): return super().rename( - index, copy=copy, inplace=inplace, level=level, errors=errors + mapper, copy=copy, inplace=inplace, level=level, errors=errors ) else: - return self._set_name(index, inplace=inplace) + return self._set_name(mapper, inplace=inplace) @overload def set_axis( diff --git a/pandas/tests/series/methods/test_rename.py b/pandas/tests/series/methods/test_rename.py index eacafa9310384..0fbd5ec1bcf84 100644 --- a/pandas/tests/series/methods/test_rename.py +++ b/pandas/tests/series/methods/test_rename.py @@ -1,6 +1,7 @@ from datetime import datetime import numpy as np +import pytest from pandas import ( Index, @@ -101,3 +102,15 @@ def test_rename_callable(self): tm.assert_series_equal(result, expected) assert result.name == expected.name + + def test_rename_method_and_index(self): + # GH 40977 + s = Series([1, 2]) + with pytest.raises(TypeError, match="Cannot specify both 'mapper' and 'index'"): + s.rename(str, index=str) + + def test_rename_no_method_no_index(self): + # GH 40977 + s = Series([1, 2]) + with pytest.raises(TypeError, match="Must pass a mapper"): + s.rename(inplace=False) From ad1f65cc7f6d72bebf98d2848efb704c8be7f8a3 Mon Sep 17 00:00:00 2001 From: Marco Gorelli Date: Fri, 16 Apr 2021 16:37:35 +0100 Subject: [PATCH 2/7] allow renaming with None --- pandas/core/series.py | 2 -- pandas/tests/series/methods/test_rename.py | 9 +++++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/pandas/core/series.py b/pandas/core/series.py index b14c209e02a7e..d9c96eb5e5027 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -4416,8 +4416,6 @@ def rename( """ if index is not None and mapper is not None: raise TypeError("Cannot specify both 'mapper' and 'index'") - if index is None and mapper is None: - raise TypeError("Must pass a mapper") if mapper is None: mapper = index if callable(mapper) or is_dict_like(mapper): diff --git a/pandas/tests/series/methods/test_rename.py b/pandas/tests/series/methods/test_rename.py index 0fbd5ec1bcf84..b4f3c21732bd4 100644 --- a/pandas/tests/series/methods/test_rename.py +++ b/pandas/tests/series/methods/test_rename.py @@ -109,8 +109,9 @@ def test_rename_method_and_index(self): with pytest.raises(TypeError, match="Cannot specify both 'mapper' and 'index'"): s.rename(str, index=str) - def test_rename_no_method_no_index(self): + def test_rename_none(self): # GH 40977 - s = Series([1, 2]) - with pytest.raises(TypeError, match="Must pass a mapper"): - s.rename(inplace=False) + s = Series([1, 2], name="foo") + result = s.rename(None) + expected = Series([1, 2]) + tm.assert_series_equal(result, expected) From 77f4bdcc10d05f523f411d13d7974ca058546c03 Mon Sep 17 00:00:00 2001 From: Marco Gorelli Date: Sat, 17 Apr 2021 09:46:45 +0100 Subject: [PATCH 3/7] cast -> type: ignore --- pandas/core/groupby/groupby.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/core/groupby/groupby.py b/pandas/core/groupby/groupby.py index 184043afbe0c8..73dcf7aa4080c 100644 --- a/pandas/core/groupby/groupby.py +++ b/pandas/core/groupby/groupby.py @@ -28,7 +28,6 @@ class providing the base-class of operations. Sequence, TypeVar, Union, - cast, ) import numpy as np @@ -1699,7 +1698,8 @@ def size(self) -> FrameOrSeriesUnion: result = self._obj_1d_constructor(result) if not self.as_index: - result = cast(Series, result.rename("size")).reset_index() + # Item "None" of "Optional[Series]" has no attribute "reset_index" + result = result.rename("size").reset_index() # type: ignore[union-attr] return self._reindex_output(result, fill_value=0) From b249ee41fc42d3960e61f903a2737d82453fbf09 Mon Sep 17 00:00:00 2001 From: Marco Gorelli Date: Sun, 25 Apr 2021 12:27:17 +0100 Subject: [PATCH 4/7] remove rewrite_axis_style_signature --- pandas/core/frame.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pandas/core/frame.py b/pandas/core/frame.py index 38766d2856cfe..dea7c2bbdb6e6 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -4873,10 +4873,6 @@ def drop( errors=errors, ) - @rewrite_axis_style_signature( - "mapper", - [("copy", True), ("inplace", False), ("level", None), ("errors", "ignore")], - ) def rename( self, mapper: Renamer | None = None, From 4ffdb3f38085a8ee7fa4a2e8a5803f8dcb029959 Mon Sep 17 00:00:00 2001 From: Marco Gorelli Date: Sun, 25 Apr 2021 14:20:43 +0100 Subject: [PATCH 5/7] ignore error (will be fixed later w/overload) --- pandas/io/json/_normalize.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pandas/io/json/_normalize.py b/pandas/io/json/_normalize.py index 3d07b9d98f9a9..88052833eba31 100644 --- a/pandas/io/json/_normalize.py +++ b/pandas/io/json/_normalize.py @@ -476,7 +476,11 @@ def _recursive_extract(data, path, seen_meta, level=0): result = DataFrame(records) if record_prefix is not None: - result = result.rename(columns=lambda x: f"{record_prefix}{x}") + # Incompatible types in assignment (expression has type "Optional[DataFrame]", + # variable has type "DataFrame") + result = result.rename( + columns=lambda x: f"{record_prefix}{x}" + ) # type: ignore[assignment] # Data types, a problem for k, v in meta_vals.items(): From 0a6baf8b43d6ea81a86f2e87d19e4116ae592b71 Mon Sep 17 00:00:00 2001 From: Marco Gorelli Date: Sun, 25 Apr 2021 14:20:59 +0100 Subject: [PATCH 6/7] ignore error (will be fixed later w/overload) --- pandas/io/json/_normalize.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/io/json/_normalize.py b/pandas/io/json/_normalize.py index 88052833eba31..1b0a2c086c91c 100644 --- a/pandas/io/json/_normalize.py +++ b/pandas/io/json/_normalize.py @@ -478,9 +478,9 @@ def _recursive_extract(data, path, seen_meta, level=0): if record_prefix is not None: # Incompatible types in assignment (expression has type "Optional[DataFrame]", # variable has type "DataFrame") - result = result.rename( + result = result.rename( # type: ignore[assignment] columns=lambda x: f"{record_prefix}{x}" - ) # type: ignore[assignment] + ) # Data types, a problem for k, v in meta_vals.items(): From d027e6d2ce7a5de9f8d478f17d72909a0ed8bf65 Mon Sep 17 00:00:00 2001 From: Marco Edward Gorelli Date: Wed, 28 Apr 2021 17:17:21 +0100 Subject: [PATCH 7/7] s -> ser (avoid one-letter name) --- pandas/tests/series/methods/test_rename.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pandas/tests/series/methods/test_rename.py b/pandas/tests/series/methods/test_rename.py index b4f3c21732bd4..7c54109cf81fd 100644 --- a/pandas/tests/series/methods/test_rename.py +++ b/pandas/tests/series/methods/test_rename.py @@ -105,13 +105,13 @@ def test_rename_callable(self): def test_rename_method_and_index(self): # GH 40977 - s = Series([1, 2]) + ser = Series([1, 2]) with pytest.raises(TypeError, match="Cannot specify both 'mapper' and 'index'"): - s.rename(str, index=str) + ser.rename(str, index=str) def test_rename_none(self): # GH 40977 - s = Series([1, 2], name="foo") - result = s.rename(None) + ser = Series([1, 2], name="foo") + result = ser.rename(None) expected = Series([1, 2]) tm.assert_series_equal(result, expected)