From d4e0d3e4f1d471faff256483af1aa916bcfd7a08 Mon Sep 17 00:00:00 2001 From: Brock Date: Sat, 5 Jul 2025 14:18:46 -0700 Subject: [PATCH 1/2] PERF: avoid object-dtype path in ArrowEA._explode --- pandas/core/arrays/arrow/array.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pandas/core/arrays/arrow/array.py b/pandas/core/arrays/arrow/array.py index b4e60819b033f..e3a8d973f02a8 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 a 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) From 0ac956726413dcc7330b651d8a09cb36b0928f1e Mon Sep 17 00:00:00 2001 From: Brock Date: Sat, 5 Jul 2025 14:19:35 -0700 Subject: [PATCH 2/2] typo fixup --- pandas/core/arrays/arrow/array.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/arrays/arrow/array.py b/pandas/core/arrays/arrow/array.py index e3a8d973f02a8..8c90427f07d28 100644 --- a/pandas/core/arrays/arrow/array.py +++ b/pandas/core/arrays/arrow/array.py @@ -1909,7 +1909,7 @@ def _explode(self): mask = counts == 0 if mask.any(): # pc.if_else here is similar to `values[mask] = fill_value` - # but this avoids a object-dtype round-trip. + # 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()