diff --git a/pandas/core/arrays/arrow/array.py b/pandas/core/arrays/arrow/array.py index c07aee737934b..551b925f42579 100644 --- a/pandas/core/arrays/arrow/array.py +++ b/pandas/core/arrays/arrow/array.py @@ -433,11 +433,15 @@ def __abs__(self) -> Self: # https://issues.apache.org/jira/browse/ARROW-10739 is addressed def __getstate__(self): state = self.__dict__.copy() - state["_data"] = self._pa_array.combine_chunks() + state["_pa_array"] = self._pa_array.combine_chunks() return state def __setstate__(self, state) -> None: - state["_pa_array"] = pa.chunked_array(state["_data"]) + if "_data" in state: + data = state.pop("_data") + else: + data = state["_pa_array"] + state["_pa_array"] = pa.chunked_array(data) self.__dict__.update(state) def _cmp_method(self, other, op): diff --git a/pandas/tests/extension/test_arrow.py b/pandas/tests/extension/test_arrow.py index fcca2e4fa8e8e..2378710555340 100644 --- a/pandas/tests/extension/test_arrow.py +++ b/pandas/tests/extension/test_arrow.py @@ -2351,3 +2351,20 @@ def test_concat_empty_arrow_backed_series(dtype): expected = ser.copy() result = pd.concat([ser[np.array([], dtype=np.bool_)]]) tm.assert_series_equal(result, expected) + + +# _data was renamed to _pa_data +class OldArrowExtensionArray(ArrowExtensionArray): + def __getstate__(self): + state = super().__getstate__() + state["_data"] = state.pop("_pa_array") + return state + + +def test_pickle_old_arrowextensionarray(): + data = pa.array([1]) + expected = OldArrowExtensionArray(data) + result = pickle.loads(pickle.dumps(expected)) + tm.assert_extension_array_equal(result, expected) + assert result._pa_array == pa.chunked_array(data) + assert not hasattr(result, "_data")