@@ -590,7 +590,9 @@ def swapaxes(self: FrameOrSeries, axis1, axis2, copy=True) -> FrameOrSeries:
590590 if copy :
591591 new_values = new_values .copy ()
592592
593- return self ._constructor (new_values , * new_axes ).__finalize__ (self )
593+ return self ._constructor (new_values , * new_axes ).__finalize__ (
594+ self , method = "swapaxes"
595+ )
594596
595597 def droplevel (self : FrameOrSeries , level , axis = 0 ) -> FrameOrSeries :
596598 """
@@ -993,7 +995,7 @@ def rename(
993995 self ._update_inplace (result )
994996 return None
995997 else :
996- return result .__finalize__ (self )
998+ return result .__finalize__ (self , method = "rename" )
997999
9981000 @rewrite_axis_style_signature ("mapper" , [("copy" , True ), ("inplace" , False )])
9991001 def rename_axis (self , mapper = lib .no_default , ** kwargs ):
@@ -1357,7 +1359,7 @@ def __invert__(self):
13571359 return self
13581360
13591361 new_data = self ._mgr .apply (operator .invert )
1360- result = self ._constructor (new_data ).__finalize__ (self )
1362+ result = self ._constructor (new_data ).__finalize__ (self , method = "__invert__" )
13611363 return result
13621364
13631365 def __nonzero__ (self ):
@@ -1802,7 +1804,9 @@ def __array_wrap__(self, result, context=None):
18021804 # ptp also requires the item_from_zerodim
18031805 return result
18041806 d = self ._construct_axes_dict (self ._AXIS_ORDERS , copy = False )
1805- return self ._constructor (result , ** d ).__finalize__ (self )
1807+ return self ._constructor (result , ** d ).__finalize__ (
1808+ self , method = "__array_wrap__"
1809+ )
18061810
18071811 # ideally we would define this to avoid the getattr checks, but
18081812 # is slower
@@ -3361,7 +3365,7 @@ class max_speed
33613365 new_data = self ._mgr .take (
33623366 indices , axis = self ._get_block_manager_axis (axis ), verify = True
33633367 )
3364- return self ._constructor (new_data ).__finalize__ (self )
3368+ return self ._constructor (new_data ).__finalize__ (self , method = "take" )
33653369
33663370 def _take_with_is_copy (self : FrameOrSeries , indices , axis = 0 ) -> FrameOrSeries :
33673371 """
@@ -4431,7 +4435,7 @@ def reindex(self: FrameOrSeries, *args, **kwargs) -> FrameOrSeries:
44314435 # perform the reindex on the axes
44324436 return self ._reindex_axes (
44334437 axes , level , limit , tolerance , method , fill_value , copy
4434- ).__finalize__ (self )
4438+ ).__finalize__ (self , method = "reindex" )
44354439
44364440 def _reindex_axes (
44374441 self : FrameOrSeries , axes , level , limit , tolerance , method , fill_value , copy
@@ -5130,7 +5134,7 @@ def pipe(self, func, *args, **kwargs):
51305134 # Attribute access
51315135
51325136 def __finalize__ (
5133- self : FrameOrSeries , other , method = None , ** kwargs
5137+ self : FrameOrSeries , other , method : Optional [ str ] = None , ** kwargs
51345138 ) -> FrameOrSeries :
51355139 """
51365140 Propagate metadata from other to self.
@@ -5139,9 +5143,14 @@ def __finalize__(
51395143 ----------
51405144 other : the object from which to get the attributes that we are going
51415145 to propagate
5142- method : optional, a passed method name ; possibly to take different
5143- types of propagation actions based on this
5146+ method : str, optional
5147+ A passed method name providing context on where ``__finalize__``
5148+ was called.
5149+
5150+ .. warning:
51445151
5152+ The value passed as `method` are not currently considered
5153+ stable across pandas releases.
51455154 """
51465155 if isinstance (other , NDFrame ):
51475156 for name in other .attrs :
@@ -5294,10 +5303,10 @@ def _check_inplace_setting(self, value) -> bool_t:
52945303 return True
52955304
52965305 def _get_numeric_data (self ):
5297- return self ._constructor (self ._mgr .get_numeric_data ()).__finalize__ (self )
5306+ return self ._constructor (self ._mgr .get_numeric_data ()).__finalize__ (self , )
52985307
52995308 def _get_bool_data (self ):
5300- return self ._constructor (self ._mgr .get_bool_data ()).__finalize__ (self )
5309+ return self ._constructor (self ._mgr .get_bool_data ()).__finalize__ (self , )
53015310
53025311 # ----------------------------------------------------------------------
53035312 # Internal Interface Methods
@@ -5563,8 +5572,8 @@ def astype(
55635572
55645573 else :
55655574 # else, only a single dtype is given
5566- new_data = self ._mgr .astype (dtype = dtype , copy = copy , errors = errors )
5567- return self ._constructor (new_data ).__finalize__ (self )
5575+ new_data = self ._mgr .astype (dtype = dtype , copy = copy , errors = errors , )
5576+ return self ._constructor (new_data ).__finalize__ (self , method = "astype" )
55685577
55695578 # GH 19920: retain column metadata after concat
55705579 result = pd .concat (results , axis = 1 , copy = False )
@@ -5678,7 +5687,7 @@ def copy(self: FrameOrSeries, deep: bool_t = True) -> FrameOrSeries:
56785687 """
56795688 data = self ._mgr .copy (deep = deep )
56805689 self ._clear_item_cache ()
5681- return self ._constructor (data ).__finalize__ (self )
5690+ return self ._constructor (data ).__finalize__ (self , method = "copy" )
56825691
56835692 def __copy__ (self : FrameOrSeries , deep : bool_t = True ) -> FrameOrSeries :
56845693 return self .copy (deep = deep )
@@ -5784,7 +5793,7 @@ def infer_objects(self: FrameOrSeries) -> FrameOrSeries:
57845793 self ._mgr .convert (
57855794 datetime = True , numeric = False , timedelta = True , coerce = False , copy = True
57865795 )
5787- ).__finalize__ (self )
5796+ ).__finalize__ (self , method = "infer_objects" )
57885797
57895798 def convert_dtypes (
57905799 self : FrameOrSeries ,
@@ -6111,7 +6120,7 @@ def fillna(
61116120 if inplace :
61126121 return self ._update_inplace (result )
61136122 else :
6114- return result .__finalize__ (self )
6123+ return result .__finalize__ (self , method = "fillna" )
61156124
61166125 def ffill (
61176126 self : FrameOrSeries ,
@@ -6627,7 +6636,7 @@ def replace(
66276636 if inplace :
66286637 return self ._update_inplace (result )
66296638 else :
6630- return result .__finalize__ (self )
6639+ return result .__finalize__ (self , method = "replace" )
66316640
66326641 _shared_docs [
66336642 "interpolate"
@@ -6893,7 +6902,7 @@ def interpolate(
68936902 if inplace :
68946903 return self ._update_inplace (result )
68956904 else :
6896- return result .__finalize__ (self )
6905+ return result .__finalize__ (self , method = "interpolate" )
68976906
68986907 # ----------------------------------------------------------------------
68996908 # Timeseries methods Methods
@@ -7131,11 +7140,11 @@ def asof(self, where, subset=None):
71317140
71327141 @Appender (_shared_docs ["isna" ] % _shared_doc_kwargs )
71337142 def isna (self : FrameOrSeries ) -> FrameOrSeries :
7134- return isna (self ).__finalize__ (self )
7143+ return isna (self ).__finalize__ (self , method = "isna" )
71357144
71367145 @Appender (_shared_docs ["isna" ] % _shared_doc_kwargs )
71377146 def isnull (self : FrameOrSeries ) -> FrameOrSeries :
7138- return isna (self ).__finalize__ (self )
7147+ return isna (self ).__finalize__ (self , method = "isnull" )
71397148
71407149 _shared_docs [
71417150 "notna"
@@ -7201,11 +7210,11 @@ def isnull(self: FrameOrSeries) -> FrameOrSeries:
72017210
72027211 @Appender (_shared_docs ["notna" ] % _shared_doc_kwargs )
72037212 def notna (self : FrameOrSeries ) -> FrameOrSeries :
7204- return notna (self ).__finalize__ (self )
7213+ return notna (self ).__finalize__ (self , method = "notna" )
72057214
72067215 @Appender (_shared_docs ["notna" ] % _shared_doc_kwargs )
72077216 def notnull (self : FrameOrSeries ) -> FrameOrSeries :
7208- return notna (self ).__finalize__ (self )
7217+ return notna (self ).__finalize__ (self , method = "notnull" )
72097218
72107219 def _clip_with_scalar (self , lower , upper , inplace : bool_t = False ):
72117220 if (lower is not None and np .any (isna (lower ))) or (
@@ -8229,7 +8238,7 @@ def ranker(data):
82298238 pct = pct ,
82308239 )
82318240 ranks = self ._constructor (ranks , ** data ._construct_axes_dict ())
8232- return ranks .__finalize__ (self )
8241+ return ranks .__finalize__ (self , method = "rank" )
82338242
82348243 # if numeric_only is None, and we can't get anything, we try with
82358244 # numeric_only=True
@@ -8436,7 +8445,10 @@ def _align_frame(
84368445 left .index = join_index
84378446 right .index = join_index
84388447
8439- return left .__finalize__ (self ), right .__finalize__ (other )
8448+ return (
8449+ left .__finalize__ (self ),
8450+ right .__finalize__ (other ),
8451+ )
84408452
84418453 def _align_series (
84428454 self ,
@@ -8520,7 +8532,10 @@ def _align_series(
85208532 left .index = join_index
85218533 right .index = join_index
85228534
8523- return left .__finalize__ (self ), right .__finalize__ (other )
8535+ return (
8536+ left .__finalize__ (self ),
8537+ right .__finalize__ (other ),
8538+ )
85248539
85258540 def _where (
85268541 self ,
@@ -8933,7 +8948,7 @@ def shift(
89338948 else :
89348949 return self .tshift (periods , freq )
89358950
8936- return self ._constructor (new_data ).__finalize__ (self )
8951+ return self ._constructor (new_data ).__finalize__ (self , method = "shift" )
89378952
89388953 def slice_shift (self : FrameOrSeries , periods : int = 1 , axis = 0 ) -> FrameOrSeries :
89398954 """
@@ -8970,7 +8985,7 @@ def slice_shift(self: FrameOrSeries, periods: int = 1, axis=0) -> FrameOrSeries:
89708985 shifted_axis = self ._get_axis (axis )[islicer ]
89718986 new_obj .set_axis (shifted_axis , axis = axis , inplace = True )
89728987
8973- return new_obj .__finalize__ (self )
8988+ return new_obj .__finalize__ (self , method = "slice_shift" )
89748989
89758990 def tshift (
89768991 self : FrameOrSeries , periods : int = 1 , freq = None , axis : Axis = 0
@@ -9030,7 +9045,7 @@ def tshift(
90309045
90319046 result = self .copy ()
90329047 result .set_axis (new_ax , axis , inplace = True )
9033- return result .__finalize__ (self )
9048+ return result .__finalize__ (self , method = "tshift" )
90349049
90359050 def truncate (
90369051 self : FrameOrSeries , before = None , after = None , axis = None , copy : bool_t = True
@@ -9241,7 +9256,7 @@ def _tz_convert(ax, tz):
92419256
92429257 result = self .copy (deep = copy )
92439258 result = result .set_axis (ax , axis = axis , inplace = False )
9244- return result .__finalize__ (self )
9259+ return result .__finalize__ (self , method = "tz_convert" )
92459260
92469261 def tz_localize (
92479262 self : FrameOrSeries ,
@@ -9410,7 +9425,7 @@ def _tz_localize(ax, tz, ambiguous, nonexistent):
94109425
94119426 result = self .copy (deep = copy )
94129427 result = result .set_axis (ax , axis = axis , inplace = False )
9413- return result .__finalize__ (self )
9428+ return result .__finalize__ (self , method = "tz_localize" )
94149429
94159430 # ----------------------------------------------------------------------
94169431 # Numeric Methods
@@ -11189,7 +11204,7 @@ def block_accum_func(blk_values):
1118911204
1119011205 d = self ._construct_axes_dict ()
1119111206 d ["copy" ] = False
11192- return self ._constructor (result , ** d ).__finalize__ (self )
11207+ return self ._constructor (result , ** d ).__finalize__ (self , method = name )
1119311208
1119411209 return set_function_name (cum_func , name , cls )
1119511210
0 commit comments