diff --git a/pandas/core/arrays/arrow/array.py b/pandas/core/arrays/arrow/array.py index b4e60819b033f..8c90427f07d28 100644 --- a/pandas/core/arrays/arrow/array.py +++ b/pandas/core/arrays/arrow/array.py @@ -1908,8 +1908,10 @@ def _explode(self): fill_value = pa.scalar([None], type=self._pa_array.type) mask = counts == 0 if mask.any(): - values = values.copy() - values[mask] = fill_value + # pc.if_else here is similar to `values[mask] = fill_value` + # but this avoids an object-dtype round-trip. + pa_values = pc.if_else(~mask, values._pa_array, fill_value) + values = type(self)(pa_values) counts = counts.copy() counts[mask] = 1 values = values.fillna(fill_value)