code: def _tile_df(cls, op):
      in_df = op.inputs[0]
      out_df = op.outputs[0]
      axis = op.axis
      elementwise = op.elementwise
  
      if not elementwise and in_df.chunk_shape[axis] > 1:
          chunk_size = (
              in_df.shape[axis],
              max(1, options.chunk_store_limit // in_df.shape[axis]),
          )
          if axis == 1:
              chunk_size = chunk_size[::-1]
          in_df = yield from recursive_tile(in_df.rechunk(chunk_size))
  
      chunks = []
      if (
          op.output_types
          and op.output_types[0] == OutputType.df_or_series
      ):
          for c in in_df.chunks:
              new_op = op.copy().reset_key()
              new_op.tileable_op_key = op.key
              chunks.append(
                  new_op.new_chunk(
                      [c], collapse_axis=axis, index=c.index
                  )
              )
          new_nsplits = None
      elif out_df.ndim == 2:
          for c in in_df.chunks:
              if elementwise:
                  new_shape = c.shape
                  new_index_value, new_columns_value = (
                      c.index_value,
                      c.columns_value,
                  )
              else:
                  new_shape = [np.nan, np.nan]
                  new_shape[1 - axis] = c.shape[1 - axis]
                  if axis == 0:
                      new_index_value = out_df.index_value
                      new_columns_value = c.columns_value
                  else:
                      new_index_value = c.index_value
                      new_columns_value = out_df.columns_value
  
              if op.axis == 0:
                  new_dtypes = out_df.dtypes[c.dtypes.keys()]
              else:
                  new_dtypes = out_df.dtypes
  
              new_op = op.copy().reset_key()
              new_op.tileable_op_key = op.key
              chunks.append(
                  new_op.new_chunk(
                      [c],
                      shape=tuple(new_shape),
                      index=c.index,
                      dtypes=new_dtypes,
                      index_value=new_index_value,
                      columns_value=new_columns_value,
                  )
              )
  
          new_nsplits = list(in_df.nsplits)
          if not elementwise:
              new_nsplits[axis] = (np.nan,) * len(new_nsplits[axis])
      else:
          for c in in_df.chunks:
              shape_len = c.shape[1 - axis]
              new_index_value = (
                  c.index_value if axis == 1 else c.columns_value
              )
              new_index = (c.index[1 - axis],)
              new_op = op.copy().reset_key()
              new_op.tileable_op_key = op.key
              chunks.append(
                  new_op.new_chunk(
                      [c],
                      shape=(shape_len,),
                      index=new_index,
                      dtype=out_df.dtype,
                      index_value=new_index_value,
                  )
              )
          new_nsplits = (in_df.nsplits[1 - axis],)
  
      new_op = op.copy()
      kw = out_df.params.copy()
      if isinstance(new_nsplits, list):
          new_nsplits = tuple(new_nsplits)
      kw.update(dict(chunks=chunks, nsplits=new_nsplits))
      return new_op.new_tileables(op.inputs, **kw)
  
imports: import inspect
  import numpy
  import pandas
  from ...None import opcodes
  from ...config import options
  from ...core import OutputType, recursive_tile
  from ...core.custom_log import redirect_custom_log
  from ...core.operand import OperatorLogicKeyGeneratorMixin
  from ...serialization.serializables import StringField, AnyField, BoolField, TupleField, DictField, FunctionField
  from ...utils import enter_current_session, quiet_stdio, get_func_token, tokenize
  from ..arrays import ArrowArray
  from ..operands import DataFrameOperandMixin, DataFrameOperand
  from ..utils import build_df, build_series, parse_index, validate_axis, validate_output_types, make_dtypes, make_dtype, build_empty_df, build_empty_series, clean_up_func, restore_func
label_desc: Use image node_id 19 for calling the ApplyOperand obj's underlying member method code with example usage: obj._tile_df(cls, op) and returns: new_op