@@ -351,22 +351,32 @@ def sort(cls, dataset, by=None, reverse=False):
351
351
return dataset .data .sort (columns = cols , ascending = not reverse )
352
352
return dataset .data .sort_values (by = cols , ascending = not reverse )
353
353
354
+ @classmethod
355
+ def index_selection (cls , df , selection ):
356
+ index_sel = {}
357
+ skip_index = True
358
+ for idx in cls .indexes (df ):
359
+ if idx not in selection :
360
+ index_sel [idx ] = slice (None , None )
361
+ continue
362
+ skip_index = False
363
+ sel = selection [idx ]
364
+ if isinstance (sel , tuple ) and len (sel ) < 4 :
365
+ sel = slice (* sel )
366
+ elif not isinstance (sel , (list , slice )):
367
+ sel = [sel ]
368
+ index_sel [idx ] = sel
369
+ return {} if skip_index else index_sel
354
370
355
371
@classmethod
356
372
def select (cls , dataset , selection_mask = None , ** selection ):
357
373
df = dataset .data
358
374
if selection_mask is None :
359
- indexes = {
360
- idx : v
361
- for idx in cls .indexes (df )
362
- if isinstance ((v := selection .get (idx )), slice ) or
363
- isinstance (v , tuple ) and len (v ) < 4 and (v := slice (* v ))
364
- } if not isinstance (df .index , pd .MultiIndex ) else {}
365
- if selection .keys () - indexes .keys ():
366
- selection_mask = cls .select_mask (dataset , selection )
367
- else :
368
- for v in indexes .values ():
369
- df = df [v ]
375
+ if index_sel := cls .index_selection (df , selection ):
376
+ df = df .loc [tuple (index_sel .values ()), :]
377
+ column_sel = {k : v for k , v in selection .items () if k not in index_sel }
378
+ if column_sel :
379
+ selection_mask = cls .select_mask (dataset , column_sel )
370
380
371
381
indexed = cls .indexed (dataset , selection )
372
382
if isinstance (selection_mask , pd .Series ):
0 commit comments