@@ -335,10 +335,6 @@ cdef class Slider:
335
335
self .buf.shape[0 ] = 0
336
336
337
337
338
- class InvalidApply (Exception ):
339
- pass
340
-
341
-
342
338
def apply_frame_axis0 (object frame , object f , object names ,
343
339
const int64_t[:] starts , const int64_t[:] ends ):
344
340
cdef:
@@ -365,11 +361,7 @@ def apply_frame_axis0(object frame, object f, object names,
365
361
chunk = slider.dummy
366
362
object .__setattr__ (chunk, ' name' , names[i])
367
363
368
- try :
369
- piece = f(chunk)
370
- except Exception as err:
371
- # We can't be more specific without knowing something about `f`
372
- raise InvalidApply(" Let this error raise above us" ) from err
364
+ piece = f(chunk)
373
365
374
366
# Need to infer if low level index slider will cause segfaults
375
367
require_slow_apply = i == 0 and piece is chunk
@@ -406,7 +398,8 @@ cdef class BlockSlider:
406
398
"""
407
399
cdef:
408
400
object frame, dummy, index, block
409
- list blk_values
401
+ list blocks, blk_values
402
+ ndarray orig_blklocs, orig_blknos
410
403
ndarray values
411
404
Slider idx_slider
412
405
char ** base_ptrs
@@ -418,6 +411,13 @@ cdef class BlockSlider:
418
411
self .dummy = frame[:0 ]
419
412
self .index = self .dummy.index
420
413
414
+ # GH#35417 attributes we need to restore at each step in case
415
+ # the function modified them.
416
+ mgr = self .dummy._mgr
417
+ self .orig_blklocs = mgr.blklocs
418
+ self .orig_blknos = mgr.blknos
419
+ self .blocks = [x for x in self .dummy._mgr.blocks]
420
+
421
421
self .blk_values = [block.values for block in self .dummy._mgr.blocks]
422
422
423
423
for values in self .blk_values:
@@ -441,6 +441,9 @@ cdef class BlockSlider:
441
441
cdef:
442
442
ndarray arr
443
443
Py_ssize_t i
444
+
445
+ self ._restore_blocks()
446
+
444
447
# move blocks
445
448
for i in range (self .nblocks):
446
449
arr = self .blk_values[i]
@@ -460,9 +463,21 @@ cdef class BlockSlider:
460
463
cdef:
461
464
ndarray arr
462
465
Py_ssize_t i
466
+
467
+ self ._restore_blocks()
468
+
463
469
for i in range (self .nblocks):
464
470
arr = self .blk_values[i]
465
471
466
472
# axis=1 is the frame's axis=0
467
473
arr.data = self .base_ptrs[i]
468
474
arr.shape[1 ] = 0
475
+
476
+ cdef _restore_blocks(self ):
477
+ """
478
+ Ensure that we have the original blocks, blknos, and blklocs.
479
+ """
480
+ mgr = self .dummy._mgr
481
+ mgr.blocks = self .blocks
482
+ mgr._blklocs = self .orig_blklocs
483
+ mgr._blknos = self .orig_blknos
0 commit comments