|
64 | 64 | )
|
65 | 65 | from pandas.core.dtypes.concat import concat_compat
|
66 | 66 | from pandas.core.dtypes.dtypes import (
|
| 67 | + BaseMaskedDtype, |
67 | 68 | ExtensionDtype,
|
68 | 69 | PandasDtype,
|
69 | 70 | )
|
|
103 | 104 | Series,
|
104 | 105 | )
|
105 | 106 | from pandas.core.arrays import (
|
| 107 | + BaseMaskedArray, |
106 | 108 | DatetimeArray,
|
107 | 109 | ExtensionArray,
|
108 | 110 | TimedeltaArray,
|
@@ -142,6 +144,15 @@ def _ensure_data(values: ArrayLike) -> np.ndarray:
|
142 | 144 | if is_object_dtype(values.dtype):
|
143 | 145 | return ensure_object(np.asarray(values))
|
144 | 146 |
|
| 147 | + elif isinstance(values.dtype, BaseMaskedDtype): |
| 148 | + # i.e. BooleanArray, FloatingArray, IntegerArray |
| 149 | + values = cast("BaseMaskedArray", values) |
| 150 | + if not values._hasna: |
| 151 | + # No pd.NAs -> We can avoid an object-dtype cast (and copy) GH#41816 |
| 152 | + # recurse to avoid re-implementing logic for eg bool->uint8 |
| 153 | + return _ensure_data(values._data) |
| 154 | + return np.asarray(values) |
| 155 | + |
145 | 156 | elif is_bool_dtype(values.dtype):
|
146 | 157 | if isinstance(values, np.ndarray):
|
147 | 158 | # i.e. actually dtype == np.dtype("bool")
|
@@ -1188,18 +1199,6 @@ def compute(self, method: str) -> Series:
|
1188 | 1199 | dropped = self.obj.dropna()
|
1189 | 1200 | nan_index = self.obj.drop(dropped.index)
|
1190 | 1201 |
|
1191 |
| - if is_extension_array_dtype(dropped.dtype): |
1192 |
| - # GH#41816 bc we have dropped NAs above, MaskedArrays can use the |
1193 |
| - # numpy logic. |
1194 |
| - from pandas.core.arrays import BaseMaskedArray |
1195 |
| - |
1196 |
| - arr = dropped._values |
1197 |
| - if isinstance(arr, BaseMaskedArray): |
1198 |
| - ser = type(dropped)(arr._data, index=dropped.index, name=dropped.name) |
1199 |
| - |
1200 |
| - result = type(self)(ser, n=self.n, keep=self.keep).compute(method) |
1201 |
| - return result.astype(arr.dtype) |
1202 |
| - |
1203 | 1202 | # slow method
|
1204 | 1203 | if n >= len(self.obj):
|
1205 | 1204 | ascending = method == "nsmallest"
|
|
0 commit comments