3030from pandas ._config import config
3131
3232from pandas ._libs import Timestamp , iNaT , lib , properties
33- from pandas ._typing import Dtype , FilePathOrBuffer , FrameOrSeries , JSONSerializable
33+ from pandas ._typing import (
34+ Axis ,
35+ Dtype ,
36+ FilePathOrBuffer ,
37+ FrameOrSeries ,
38+ JSONSerializable ,
39+ Level ,
40+ Renamer ,
41+ )
3442from pandas .compat import set_function_name
3543from pandas .compat ._optional import import_optional_dependency
3644from pandas .compat .numpy import function as nv
@@ -921,7 +929,18 @@ def swaplevel(self: FrameOrSeries, i=-2, j=-1, axis=0) -> FrameOrSeries:
921929 # ----------------------------------------------------------------------
922930 # Rename
923931
924- def rename (self , * args , ** kwargs ):
932+ def rename (
933+ self : FrameOrSeries ,
934+ mapper : Optional [Renamer ] = None ,
935+ * ,
936+ index : Optional [Renamer ] = None ,
937+ columns : Optional [Renamer ] = None ,
938+ axis : Optional [Axis ] = None ,
939+ copy : bool = True ,
940+ inplace : bool = False ,
941+ level : Optional [Level ] = None ,
942+ errors : str = "ignore" ,
943+ ) -> Optional [FrameOrSeries ]:
925944 """
926945 Alter axes input function or functions. Function / dict values must be
927946 unique (1-to-1). Labels not contained in a dict / Series will be left
@@ -1034,44 +1053,46 @@ def rename(self, *args, **kwargs):
10341053
10351054 See the :ref:`user guide <basics.rename>` for more.
10361055 """
1037- axes , kwargs = self ._construct_axes_from_arguments (args , kwargs )
1038- copy = kwargs .pop ("copy" , True )
1039- inplace = kwargs .pop ("inplace" , False )
1040- level = kwargs .pop ("level" , None )
1041- axis = kwargs .pop ("axis" , None )
1042- errors = kwargs .pop ("errors" , "ignore" )
1043- if axis is not None :
1044- # Validate the axis
1045- self ._get_axis_number (axis )
1046-
1047- if kwargs :
1048- raise TypeError (
1049- "rename() got an unexpected keyword "
1050- f'argument "{ list (kwargs .keys ())[0 ]} "'
1051- )
1052-
1053- if com .count_not_none (* axes .values ()) == 0 :
1056+ if mapper is None and index is None and columns is None :
10541057 raise TypeError ("must pass an index to rename" )
10551058
1056- self ._consolidate_inplace ()
1059+ if index is not None or columns is not None :
1060+ if axis is not None :
1061+ raise TypeError (
1062+ "Cannot specify both 'axis' and any of 'index' or 'columns'"
1063+ )
1064+ elif mapper is not None :
1065+ raise TypeError (
1066+ "Cannot specify both 'mapper' and any of 'index' or 'columns'"
1067+ )
1068+ else :
1069+ # use the mapper argument
1070+ if axis and self ._get_axis_number (axis ) == 1 :
1071+ columns = mapper
1072+ else :
1073+ index = mapper
1074+
10571075 result = self if inplace else self .copy (deep = copy )
10581076
1059- # start in the axis order to eliminate too many copies
1060- for axis in range (self ._AXIS_LEN ):
1061- v = axes .get (self ._AXIS_NAMES [axis ])
1062- if v is None :
1077+ for axis_no , replacements in enumerate ((index , columns )):
1078+ if replacements is None :
10631079 continue
1064- f = com .get_rename_function (v )
1065- baxis = self ._get_block_manager_axis (axis )
1080+
1081+ ax = self ._get_axis (axis_no )
1082+ baxis = self ._get_block_manager_axis (axis_no )
1083+ f = com .get_rename_function (replacements )
1084+
10661085 if level is not None :
1067- level = self . axes [ axis ] ._get_level_number (level )
1086+ level = ax ._get_level_number (level )
10681087
10691088 # GH 13473
1070- if not callable (v ):
1071- indexer = self . axes [ axis ]. get_indexer_for (v )
1089+ if not callable (replacements ):
1090+ indexer = ax . get_indexer_for (replacements )
10721091 if errors == "raise" and len (indexer [indexer == - 1 ]):
10731092 missing_labels = [
1074- label for index , label in enumerate (v ) if indexer [index ] == - 1
1093+ label
1094+ for index , label in enumerate (replacements )
1095+ if indexer [index ] == - 1
10751096 ]
10761097 raise KeyError (f"{ missing_labels } not found in axis" )
10771098
@@ -1082,6 +1103,7 @@ def rename(self, *args, **kwargs):
10821103
10831104 if inplace :
10841105 self ._update_inplace (result ._data )
1106+ return None
10851107 else :
10861108 return result .__finalize__ (self )
10871109
@@ -4036,7 +4058,7 @@ def add_prefix(self: FrameOrSeries, prefix: str) -> FrameOrSeries:
40364058 f = functools .partial ("{prefix}{}" .format , prefix = prefix )
40374059
40384060 mapper = {self ._info_axis_name : f }
4039- return self .rename (** mapper )
4061+ return self .rename (** mapper ) # type: ignore
40404062
40414063 def add_suffix (self : FrameOrSeries , suffix : str ) -> FrameOrSeries :
40424064 """
@@ -4095,7 +4117,7 @@ def add_suffix(self: FrameOrSeries, suffix: str) -> FrameOrSeries:
40954117 f = functools .partial ("{}{suffix}" .format , suffix = suffix )
40964118
40974119 mapper = {self ._info_axis_name : f }
4098- return self .rename (** mapper )
4120+ return self .rename (** mapper ) # type: ignore
40994121
41004122 def sort_values (
41014123 self ,
0 commit comments