diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 0f0078fc3398b..227722219d59a 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -6038,7 +6038,12 @@ def __finalize__(self, other, method: str | None = None, **kwargs) -> Self: if all(bool(obj.attrs) for obj in objs): # all concatenate arguments have non-empty attrs attrs = objs[0].attrs - have_same_attrs = all(obj.attrs == attrs for obj in objs[1:]) + have_same_attrs = all( + (obj.attrs == attrs).all() + if isinstance(obj.attrs, np.ndarray) + else obj.attrs == attrs + for obj in objs[1:] + ) if have_same_attrs: self.attrs = deepcopy(attrs) diff --git a/pandas/tests/generic/test_finalize.py b/pandas/tests/generic/test_finalize.py index 433e559ef620e..cb6b7d46a227d 100644 --- a/pandas/tests/generic/test_finalize.py +++ b/pandas/tests/generic/test_finalize.py @@ -55,6 +55,7 @@ (pd.Series, ([0, 0],), operator.methodcaller("notna")), (pd.Series, ([0, 0],), operator.methodcaller("notnull")), (pd.Series, ([1],), operator.methodcaller("add", pd.Series([1]))), + (pd.Series, ([0],), operator.methodcaller("concat")), # TODO: mul, div, etc. ( pd.Series, @@ -710,3 +711,15 @@ def test_finalize_frame_series_name(): df = pd.DataFrame({"name": [1, 2]}) result = pd.Series([1, 2]).__finalize__(df) assert result.name is None + + +def test_finalize_attrs_ndarray(): + # create two separate df's as single series as input + df1 = pd.DataFrame({"A": [1, 2, 3]}) + df2 = pd.DataFrame({"A": [4, 5, 6]}) + + df1.attrs["array_attr"] = np.array([1, 2, 3]) + df2.attrs["array_attr"] = np.array([1, 2, 3]) + + result = df1.__finalize__(df2, method="concat") + assert (result.attrs["array_attr"] == np.array([1, 2, 3])).all()