|
8 | 8 |
|
9 | 9 | from pandas._libs import NaT, algos as libalgos, lib, writers
|
10 | 10 | import pandas._libs.internals as libinternals
|
| 11 | +from pandas._libs.internals import BlockPlacement |
11 | 12 | from pandas._libs.tslibs import conversion
|
12 | 13 | from pandas._libs.tslibs.timezones import tz_compare
|
13 | 14 | from pandas._typing import ArrayLike
|
@@ -112,6 +113,19 @@ class Block(PandasObject):
|
112 | 113 | _verify_integrity = True
|
113 | 114 | _validate_ndim = True
|
114 | 115 |
|
| 116 | + @classmethod |
| 117 | + def _simple_new( |
| 118 | + cls, values: ArrayLike, placement: BlockPlacement, ndim: int |
| 119 | + ) -> "Block": |
| 120 | + """ |
| 121 | + Fastpath constructor, does *no* validation |
| 122 | + """ |
| 123 | + obj = object.__new__(cls) |
| 124 | + obj.ndim = ndim |
| 125 | + obj.values = values |
| 126 | + obj._mgr_locs = placement |
| 127 | + return obj |
| 128 | + |
115 | 129 | def __init__(self, values, placement, ndim=None):
|
116 | 130 | self.ndim = self._check_ndim(values, ndim)
|
117 | 131 | self.mgr_locs = placement
|
@@ -289,13 +303,15 @@ def getitem_block(self, slicer, new_mgr_locs=None):
|
289 | 303 | if new_mgr_locs is None:
|
290 | 304 | axis0_slicer = slicer[0] if isinstance(slicer, tuple) else slicer
|
291 | 305 | new_mgr_locs = self.mgr_locs[axis0_slicer]
|
| 306 | + elif not isinstance(new_mgr_locs, BlockPlacement): |
| 307 | + new_mgr_locs = BlockPlacement(new_mgr_locs) |
292 | 308 |
|
293 | 309 | new_values = self._slice(slicer)
|
294 | 310 |
|
295 | 311 | if self._validate_ndim and new_values.ndim != self.ndim:
|
296 | 312 | raise ValueError("Only same dim slicing is allowed")
|
297 | 313 |
|
298 |
| - return self.make_block_same_class(new_values, new_mgr_locs) |
| 314 | + return type(self)._simple_new(new_values, new_mgr_locs, self.ndim) |
299 | 315 |
|
300 | 316 | @property
|
301 | 317 | def shape(self):
|
|
0 commit comments