Skip to content

Commit 968b517

Browse files
Backport PR pandas-dev#54508 on branch 2.1.x (PERF: DataFrame.iloc[int] for EA dtypes) (pandas-dev#54700)
Backport PR pandas-dev#54508: PERF: DataFrame.iloc[int] for EA dtypes Co-authored-by: Luke Manley <[email protected]>
1 parent dc27aee commit 968b517

File tree

2 files changed

+7
-15
lines changed

2 files changed

+7
-15
lines changed

doc/source/whatsnew/v2.1.0.rst

+1
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,7 @@ Performance improvements
622622
- Performance improvement in :meth:`.ArrowExtensionArray.to_numpy` (:issue:`52525`)
623623
- Performance improvement in :meth:`.DataFrameGroupBy.groups` (:issue:`53088`)
624624
- Performance improvement in :meth:`DataFrame.astype` when ``dtype`` is an extension dtype (:issue:`54299`)
625+
- Performance improvement in :meth:`DataFrame.iloc` when input is an single integer and dataframe is backed by extension dtypes (:issue:`54508`)
625626
- Performance improvement in :meth:`DataFrame.isin` for extension dtypes (:issue:`53514`)
626627
- Performance improvement in :meth:`DataFrame.loc` when selecting rows and columns (:issue:`53014`)
627628
- Performance improvement in :meth:`DataFrame.transpose` when transposing a DataFrame with a single PyArrow dtype (:issue:`54224`)

pandas/core/internals/managers.py

+6-15
Original file line numberDiff line numberDiff line change
@@ -968,19 +968,10 @@ def fast_xs(self, loc: int) -> SingleBlockManager:
968968

969969
n = len(self)
970970

971-
# GH#46406
972-
immutable_ea = isinstance(dtype, ExtensionDtype) and dtype._is_immutable
973-
974-
if isinstance(dtype, ExtensionDtype) and not immutable_ea:
975-
cls = dtype.construct_array_type()
976-
result = cls._empty((n,), dtype=dtype)
971+
if isinstance(dtype, ExtensionDtype):
972+
result = np.empty(n, dtype=object)
977973
else:
978-
# error: Argument "dtype" to "empty" has incompatible type
979-
# "Union[Type[object], dtype[Any], ExtensionDtype, None]"; expected
980-
# "None"
981-
result = np.empty(
982-
n, dtype=object if immutable_ea else dtype # type: ignore[arg-type]
983-
)
974+
result = np.empty(n, dtype=dtype)
984975
result = ensure_wrapped_if_datetimelike(result)
985976

986977
for blk in self.blocks:
@@ -989,9 +980,9 @@ def fast_xs(self, loc: int) -> SingleBlockManager:
989980
for i, rl in enumerate(blk.mgr_locs):
990981
result[rl] = blk.iget((i, loc))
991982

992-
if immutable_ea:
993-
dtype = cast(ExtensionDtype, dtype)
994-
result = dtype.construct_array_type()._from_sequence(result, dtype=dtype)
983+
if isinstance(dtype, ExtensionDtype):
984+
cls = dtype.construct_array_type()
985+
result = cls._from_sequence(result, dtype=dtype)
995986

996987
bp = BlockPlacement(slice(0, len(result)))
997988
block = new_block(result, placement=bp, ndim=1)

0 commit comments

Comments
 (0)