Skip to content

Commit 8a8544f

Browse files
Pass method in __finalize__ (#33273)
1 parent bffafbb commit 8a8544f

File tree

4 files changed

+92
-57
lines changed

4 files changed

+92
-57
lines changed

pandas/core/base.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1521,4 +1521,4 @@ def duplicated(self, keep="first"):
15211521
else:
15221522
return self._constructor(
15231523
duplicated(self, keep=keep), index=self.index
1524-
).__finalize__(self)
1524+
).__finalize__(self, method="duplicated")

pandas/core/frame.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -2515,7 +2515,7 @@ def transpose(self, *args, copy: bool = False) -> "DataFrame":
25152515
new_values, index=self.columns, columns=self.index
25162516
)
25172517

2518-
return result.__finalize__(self)
2518+
return result.__finalize__(self, method="transpose")
25192519

25202520
@property
25212521
def T(self) -> "DataFrame":
@@ -4470,7 +4470,7 @@ def _maybe_casted_values(index, labels=None):
44704470
@Appender(_shared_docs["isna"] % _shared_doc_kwargs)
44714471
def isna(self) -> "DataFrame":
44724472
result = self._constructor(self._data.isna(func=isna))
4473-
return result.__finalize__(self)
4473+
return result.__finalize__(self, method="isna")
44744474

44754475
@Appender(_shared_docs["isna"] % _shared_doc_kwargs)
44764476
def isnull(self) -> "DataFrame":
@@ -4798,7 +4798,7 @@ def sort_values(
47984798
if inplace:
47994799
return self._update_inplace(result)
48004800
else:
4801-
return result.__finalize__(self)
4801+
return result.__finalize__(self, method="sort_values")
48024802

48034803
def sort_index(
48044804
self,
@@ -4934,7 +4934,7 @@ def sort_index(
49344934
if inplace:
49354935
return self._update_inplace(result)
49364936
else:
4937-
return result.__finalize__(self)
4937+
return result.__finalize__(self, method="sort_index")
49384938

49394939
def value_counts(
49404940
self,

pandas/core/generic.py

+46-31
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)