Skip to content

Commit efb61c5

Browse files
committed
add missing __finalize__ calls in indexers/iterators
1 parent afc06e7 commit efb61c5

File tree

3 files changed

+40
-3
lines changed

3 files changed

+40
-3
lines changed

pandas/core/frame.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1332,7 +1332,7 @@ def iterrows(self) -> Iterable[tuple[Hashable, Series]]:
13321332
columns = self.columns
13331333
klass = self._constructor_sliced
13341334
for k, v in zip(self.index, self.values):
1335-
s = klass(v, index=columns, name=k)
1335+
s = klass(v, index=columns, name=k).__finalize__(self)
13361336
yield k, s
13371337

13381338
def itertuples(
@@ -3444,7 +3444,7 @@ def _ixs(self, i: int, axis: int = 0):
34443444
index=self.columns,
34453445
name=self.index[i],
34463446
dtype=new_values.dtype,
3447-
)
3447+
).__finalize__(self)
34483448
result._set_is_copy(self, copy=copy)
34493449
return result
34503450

pandas/core/generic.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3894,7 +3894,7 @@ class animal locomotion
38943894
index=self.columns,
38953895
name=self.index[loc],
38963896
dtype=new_values.dtype,
3897-
)
3897+
).__finalize__(self)
38983898
elif is_scalar(loc):
38993899
result = self.iloc[:, slice(loc, loc + 1)]
39003900
elif axis == 1:

pandas/tests/generic/test_finalize.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,7 @@
304304
(pd.Series, [1], round),
305305
(pd.DataFrame, frame_data, operator.methodcaller("take", [0, 0])),
306306
(pd.DataFrame, frame_mi_data, operator.methodcaller("xs", "a")),
307+
(pd.DataFrame, frame_data, operator.methodcaller("xs", 0)),
307308
(pd.Series, (1, mi), operator.methodcaller("xs", "a")),
308309
(pd.DataFrame, frame_data, operator.methodcaller("get", "A")),
309310
(
@@ -768,3 +769,39 @@ def test_finalize_frame_series_name():
768769
df = pd.DataFrame({"name": [1, 2]})
769770
result = pd.Series([1, 2]).__finalize__(df)
770771
assert result.name is None
772+
773+
774+
@pytest.mark.parametrize(
775+
"locindexer",
776+
[
777+
lambda x: x.iloc[0], # returns Series
778+
lambda x: x.iloc[:-1],
779+
lambda x: x.iloc[[0, 1]],
780+
lambda x: x.iloc[[True, True, False]],
781+
lambda x: x.loc["idxA"], # returns Series
782+
lambda x: x.loc[["idxA", "idxB"]],
783+
lambda x: x.loc["idxA":"idxB"],
784+
lambda x: x.loc[[True, True, False]],
785+
lambda x: x.loc[
786+
pd.Series(
787+
data=[True, True, False, True], index=["idxA", "idxB", "idxC", "idxD"]
788+
)
789+
],
790+
lambda x: x.loc[pd.Index(data=["idxA", "idxC"])],
791+
],
792+
)
793+
def test_finalize_locators(locindexer):
794+
df = pd.DataFrame(
795+
{"A": [1, 2, 3], "B": [3, 4, 5], "C": [7, 8, 9]}, index=["idxA", "idxB", "idxC"]
796+
)
797+
df.attrs["A"] = 1
798+
result = locindexer(df)
799+
assert result.attrs == {"A": 1}
800+
801+
802+
@pytest.mark.parametrize("iterator", ["iterrows", "items"])
803+
def test_finalize_iterators(iterator):
804+
df = pd.DataFrame({"A": [1]})
805+
df.attrs["A"] = 1
806+
for _, row in getattr(df, iterator)():
807+
assert row.attrs == {"A": 1}

0 commit comments

Comments
 (0)