class_docstr: MultiInterface allows wrapping around a list of tabular datasets
  including dataframes, the columnar dictionary format or 2D tabular
  NumPy arrays. Using the split method the list of tabular data can
  be split into individual datasets.
  
  The interface makes the data appear a list of tabular datasets as
  a single dataset. The interface may be used to represent geometries
  so the behavior depends on the type of geometry being represented.
class_docstr_tok: ["MultiInterface","allows","wrapping","around","a","list","of","tabular","datasets","including","dataframes",",","the","columnar","dictionary","format","or","2D","tabular","NumPy","arrays",".","Using","the","split","method","the","list","of","tabular","data","can","be","split","into","individual","datasets",".","The","interface","makes","the","data","appear","a","list","of","tabular","datasets","as","a","single","dataset",".","The","interface","may","be","used","to","represent","geometries","so","the","behavior","depends","on","the","type","of","geometry","being","represented","."]
code: def iloc(cls, dataset, index):
      rows, cols = index
      scalar = np.isscalar(cols) and np.isscalar(rows)
  
      template = cls._inner_dataset_template(dataset)
      if cls.geom_type(dataset) != "Point":
          geoms = cls.select_paths(dataset, rows)
          new_data = []
          for d in geoms:
              template.data = d
              new_data.append(template.iloc[:, cols].data)
          return new_data
  
      count = 0
      new_data = []
      for d in dataset.data:
          template.data = d
          length = len(template)
          if np.isscalar(rows):
              if (count + length) > rows >= count:
                  data = template.iloc[rows - count, cols]
                  return data if scalar else [data.data]
          elif isinstance(rows, slice):
              if rows.start is not None and rows.start > (
                  count + length
              ):
                  continue
              elif rows.stop is not None and rows.stop < count:
                  break
              start = (
                  None
                  if rows.start is None
                  else max(rows.start - count, 0)
              )
              stop = (
                  None
                  if rows.stop is None
                  else min(rows.stop - count, length)
              )
              if rows.step is not None:
                  dataset.param.warning(
                      ".iloc step slicing currently not supported for"
                      "the multi-tabular data format."
                  )
              slc = slice(start, stop)
              new_data.append(template.iloc[slc, cols].data)
          else:
              sub_rows = [
                  r - count
                  for r in rows
                  if 0 <= (r - count) < (count + length)
              ]
              new = template.iloc[sub_rows, cols]
              if len(new):
                  new_data.append(new.data)
          count += length
      return new_data
  
imports: import numpy
  from ..None import util
  from ..element import Element
  from ..ndmapping import NdMapping, item_check, sorted_context
  from .dictionary import DictInterface
  from .interface import DataError, Interface
label_desc: Use image node_id 26 for calling the MultiInterface obj's underlying member method code with example usage: obj.iloc(cls, dataset, index) and returns: new_data, new_data, unknown