@@ -590,7 +590,9 @@ def swapaxes(self: FrameOrSeries, axis1, axis2, copy=True) -> FrameOrSeries:
590
590
if copy :
591
591
new_values = new_values .copy ()
592
592
593
- return self ._constructor (new_values , * new_axes ).__finalize__ (self )
593
+ return self ._constructor (new_values , * new_axes ).__finalize__ (
594
+ self , method = "swapaxes"
595
+ )
594
596
595
597
def droplevel (self : FrameOrSeries , level , axis = 0 ) -> FrameOrSeries :
596
598
"""
@@ -993,7 +995,7 @@ def rename(
993
995
self ._update_inplace (result )
994
996
return None
995
997
else :
996
- return result .__finalize__ (self )
998
+ return result .__finalize__ (self , method = "rename" )
997
999
998
1000
@rewrite_axis_style_signature ("mapper" , [("copy" , True ), ("inplace" , False )])
999
1001
def rename_axis (self , mapper = lib .no_default , ** kwargs ):
@@ -1357,7 +1359,7 @@ def __invert__(self):
1357
1359
return self
1358
1360
1359
1361
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__" )
1361
1363
return result
1362
1364
1363
1365
def __nonzero__ (self ):
@@ -1802,7 +1804,9 @@ def __array_wrap__(self, result, context=None):
1802
1804
# ptp also requires the item_from_zerodim
1803
1805
return result
1804
1806
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
+ )
1806
1810
1807
1811
# ideally we would define this to avoid the getattr checks, but
1808
1812
# is slower
@@ -3361,7 +3365,7 @@ class max_speed
3361
3365
new_data = self ._mgr .take (
3362
3366
indices , axis = self ._get_block_manager_axis (axis ), verify = True
3363
3367
)
3364
- return self ._constructor (new_data ).__finalize__ (self )
3368
+ return self ._constructor (new_data ).__finalize__ (self , method = "take" )
3365
3369
3366
3370
def _take_with_is_copy (self : FrameOrSeries , indices , axis = 0 ) -> FrameOrSeries :
3367
3371
"""
@@ -4431,7 +4435,7 @@ def reindex(self: FrameOrSeries, *args, **kwargs) -> FrameOrSeries:
4431
4435
# perform the reindex on the axes
4432
4436
return self ._reindex_axes (
4433
4437
axes , level , limit , tolerance , method , fill_value , copy
4434
- ).__finalize__ (self )
4438
+ ).__finalize__ (self , method = "reindex" )
4435
4439
4436
4440
def _reindex_axes (
4437
4441
self : FrameOrSeries , axes , level , limit , tolerance , method , fill_value , copy
@@ -5130,7 +5134,7 @@ def pipe(self, func, *args, **kwargs):
5130
5134
# Attribute access
5131
5135
5132
5136
def __finalize__ (
5133
- self : FrameOrSeries , other , method = None , ** kwargs
5137
+ self : FrameOrSeries , other , method : Optional [ str ] = None , ** kwargs
5134
5138
) -> FrameOrSeries :
5135
5139
"""
5136
5140
Propagate metadata from other to self.
@@ -5139,9 +5143,14 @@ def __finalize__(
5139
5143
----------
5140
5144
other : the object from which to get the attributes that we are going
5141
5145
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:
5144
5151
5152
+ The value passed as `method` are not currently considered
5153
+ stable across pandas releases.
5145
5154
"""
5146
5155
if isinstance (other , NDFrame ):
5147
5156
for name in other .attrs :
@@ -5294,10 +5303,10 @@ def _check_inplace_setting(self, value) -> bool_t:
5294
5303
return True
5295
5304
5296
5305
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 , )
5298
5307
5299
5308
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 , )
5301
5310
5302
5311
# ----------------------------------------------------------------------
5303
5312
# Internal Interface Methods
@@ -5563,8 +5572,8 @@ def astype(
5563
5572
5564
5573
else :
5565
5574
# 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" )
5568
5577
5569
5578
# GH 19920: retain column metadata after concat
5570
5579
result = pd .concat (results , axis = 1 , copy = False )
@@ -5678,7 +5687,7 @@ def copy(self: FrameOrSeries, deep: bool_t = True) -> FrameOrSeries:
5678
5687
"""
5679
5688
data = self ._mgr .copy (deep = deep )
5680
5689
self ._clear_item_cache ()
5681
- return self ._constructor (data ).__finalize__ (self )
5690
+ return self ._constructor (data ).__finalize__ (self , method = "copy" )
5682
5691
5683
5692
def __copy__ (self : FrameOrSeries , deep : bool_t = True ) -> FrameOrSeries :
5684
5693
return self .copy (deep = deep )
@@ -5784,7 +5793,7 @@ def infer_objects(self: FrameOrSeries) -> FrameOrSeries:
5784
5793
self ._mgr .convert (
5785
5794
datetime = True , numeric = False , timedelta = True , coerce = False , copy = True
5786
5795
)
5787
- ).__finalize__ (self )
5796
+ ).__finalize__ (self , method = "infer_objects" )
5788
5797
5789
5798
def convert_dtypes (
5790
5799
self : FrameOrSeries ,
@@ -6111,7 +6120,7 @@ def fillna(
6111
6120
if inplace :
6112
6121
return self ._update_inplace (result )
6113
6122
else :
6114
- return result .__finalize__ (self )
6123
+ return result .__finalize__ (self , method = "fillna" )
6115
6124
6116
6125
def ffill (
6117
6126
self : FrameOrSeries ,
@@ -6627,7 +6636,7 @@ def replace(
6627
6636
if inplace :
6628
6637
return self ._update_inplace (result )
6629
6638
else :
6630
- return result .__finalize__ (self )
6639
+ return result .__finalize__ (self , method = "replace" )
6631
6640
6632
6641
_shared_docs [
6633
6642
"interpolate"
@@ -6893,7 +6902,7 @@ def interpolate(
6893
6902
if inplace :
6894
6903
return self ._update_inplace (result )
6895
6904
else :
6896
- return result .__finalize__ (self )
6905
+ return result .__finalize__ (self , method = "interpolate" )
6897
6906
6898
6907
# ----------------------------------------------------------------------
6899
6908
# Timeseries methods Methods
@@ -7131,11 +7140,11 @@ def asof(self, where, subset=None):
7131
7140
7132
7141
@Appender (_shared_docs ["isna" ] % _shared_doc_kwargs )
7133
7142
def isna (self : FrameOrSeries ) -> FrameOrSeries :
7134
- return isna (self ).__finalize__ (self )
7143
+ return isna (self ).__finalize__ (self , method = "isna" )
7135
7144
7136
7145
@Appender (_shared_docs ["isna" ] % _shared_doc_kwargs )
7137
7146
def isnull (self : FrameOrSeries ) -> FrameOrSeries :
7138
- return isna (self ).__finalize__ (self )
7147
+ return isna (self ).__finalize__ (self , method = "isnull" )
7139
7148
7140
7149
_shared_docs [
7141
7150
"notna"
@@ -7201,11 +7210,11 @@ def isnull(self: FrameOrSeries) -> FrameOrSeries:
7201
7210
7202
7211
@Appender (_shared_docs ["notna" ] % _shared_doc_kwargs )
7203
7212
def notna (self : FrameOrSeries ) -> FrameOrSeries :
7204
- return notna (self ).__finalize__ (self )
7213
+ return notna (self ).__finalize__ (self , method = "notna" )
7205
7214
7206
7215
@Appender (_shared_docs ["notna" ] % _shared_doc_kwargs )
7207
7216
def notnull (self : FrameOrSeries ) -> FrameOrSeries :
7208
- return notna (self ).__finalize__ (self )
7217
+ return notna (self ).__finalize__ (self , method = "notnull" )
7209
7218
7210
7219
def _clip_with_scalar (self , lower , upper , inplace : bool_t = False ):
7211
7220
if (lower is not None and np .any (isna (lower ))) or (
@@ -8229,7 +8238,7 @@ def ranker(data):
8229
8238
pct = pct ,
8230
8239
)
8231
8240
ranks = self ._constructor (ranks , ** data ._construct_axes_dict ())
8232
- return ranks .__finalize__ (self )
8241
+ return ranks .__finalize__ (self , method = "rank" )
8233
8242
8234
8243
# if numeric_only is None, and we can't get anything, we try with
8235
8244
# numeric_only=True
@@ -8436,7 +8445,10 @@ def _align_frame(
8436
8445
left .index = join_index
8437
8446
right .index = join_index
8438
8447
8439
- return left .__finalize__ (self ), right .__finalize__ (other )
8448
+ return (
8449
+ left .__finalize__ (self ),
8450
+ right .__finalize__ (other ),
8451
+ )
8440
8452
8441
8453
def _align_series (
8442
8454
self ,
@@ -8520,7 +8532,10 @@ def _align_series(
8520
8532
left .index = join_index
8521
8533
right .index = join_index
8522
8534
8523
- return left .__finalize__ (self ), right .__finalize__ (other )
8535
+ return (
8536
+ left .__finalize__ (self ),
8537
+ right .__finalize__ (other ),
8538
+ )
8524
8539
8525
8540
def _where (
8526
8541
self ,
@@ -8933,7 +8948,7 @@ def shift(
8933
8948
else :
8934
8949
return self .tshift (periods , freq )
8935
8950
8936
- return self ._constructor (new_data ).__finalize__ (self )
8951
+ return self ._constructor (new_data ).__finalize__ (self , method = "shift" )
8937
8952
8938
8953
def slice_shift (self : FrameOrSeries , periods : int = 1 , axis = 0 ) -> FrameOrSeries :
8939
8954
"""
@@ -8970,7 +8985,7 @@ def slice_shift(self: FrameOrSeries, periods: int = 1, axis=0) -> FrameOrSeries:
8970
8985
shifted_axis = self ._get_axis (axis )[islicer ]
8971
8986
new_obj .set_axis (shifted_axis , axis = axis , inplace = True )
8972
8987
8973
- return new_obj .__finalize__ (self )
8988
+ return new_obj .__finalize__ (self , method = "slice_shift" )
8974
8989
8975
8990
def tshift (
8976
8991
self : FrameOrSeries , periods : int = 1 , freq = None , axis : Axis = 0
@@ -9030,7 +9045,7 @@ def tshift(
9030
9045
9031
9046
result = self .copy ()
9032
9047
result .set_axis (new_ax , axis , inplace = True )
9033
- return result .__finalize__ (self )
9048
+ return result .__finalize__ (self , method = "tshift" )
9034
9049
9035
9050
def truncate (
9036
9051
self : FrameOrSeries , before = None , after = None , axis = None , copy : bool_t = True
@@ -9241,7 +9256,7 @@ def _tz_convert(ax, tz):
9241
9256
9242
9257
result = self .copy (deep = copy )
9243
9258
result = result .set_axis (ax , axis = axis , inplace = False )
9244
- return result .__finalize__ (self )
9259
+ return result .__finalize__ (self , method = "tz_convert" )
9245
9260
9246
9261
def tz_localize (
9247
9262
self : FrameOrSeries ,
@@ -9410,7 +9425,7 @@ def _tz_localize(ax, tz, ambiguous, nonexistent):
9410
9425
9411
9426
result = self .copy (deep = copy )
9412
9427
result = result .set_axis (ax , axis = axis , inplace = False )
9413
- return result .__finalize__ (self )
9428
+ return result .__finalize__ (self , method = "tz_localize" )
9414
9429
9415
9430
# ----------------------------------------------------------------------
9416
9431
# Numeric Methods
@@ -11189,7 +11204,7 @@ def block_accum_func(blk_values):
11189
11204
11190
11205
d = self ._construct_axes_dict ()
11191
11206
d ["copy" ] = False
11192
- return self ._constructor (result , ** d ).__finalize__ (self )
11207
+ return self ._constructor (result , ** d ).__finalize__ (self , method = name )
11193
11208
11194
11209
return set_function_name (cum_func , name , cls )
11195
11210
0 commit comments