code: def _tile_dataframe_dataframe(cls, op: "DataFrameAlign"):
      lhs, rhs = op.lhs, op.rhs
      (
          nsplits,
          chunk_shapes,
          left_chunks,
          right_chunks,
      ) = align_dataframe_dataframe(lhs, rhs, axis=op.axis)
      cls._check_align_needed(op, left_chunks, right_chunks)
  
      left_chunk_array = np.array(left_chunks, dtype="O").reshape(
          chunk_shapes[0]
      )
      right_chunk_array = np.array(right_chunks, dtype="O").reshape(
          chunk_shapes[1]
      )
  
      left_idx_to_chunk = dict()
      l_chunks, r_chunks = [], []
  
      iterator = np.nditer(
          right_chunk_array, flags=["refs_ok", "multi_index"]
      )
      for rc_obj in iterator:
          rc = rc_obj.tolist()
          r_index = iterator.multi_index
          l_index = tuple(
              r_index[i] % chunk_shapes[0][i] for i in (0, 1)
          )
          lc = left_chunk_array[l_index]
  
          kws = [lc.params, rc.params]
          kws[0]["index"] = l_index
          kws[1]["index"] = r_index
  
          chunk_op = op.copy().reset_key()
          l_chunk, r_chunk = chunk_op.new_chunks([lc, rc], kws=kws)
          left_idx_to_chunk[l_index] = l_chunk
          r_chunks.append(r_chunk)
  
      iterator = np.nditer(
          left_chunk_array, flags=["refs_ok", "multi_index"]
      )
      for lc_obj in iterator:
          lc = lc_obj.tolist()
          l_index = iterator.multi_index
          try:
              l_chunk = left_idx_to_chunk[l_index]
              l_chunks.append(l_chunk)
              continue
          except KeyError:
              pass
  
          r_index = tuple(
              l_index[i] % chunk_shapes[1][i] for i in (0, 1)
          )
          rc = right_chunk_array[r_index]
  
          kws = [lc.params, rc.params]
          kws[0]["index"] = l_index
  
          chunk_op = op.copy().reset_key()
          l_chunk, _r_chunk = chunk_op.new_chunks([lc, rc], kws=kws)
          l_chunks.append(l_chunk)
  
      return nsplits, l_chunks, r_chunks
  
imports: from typing import Any, Optional, Union
  import numpy
  from ...None import opcodes
  from ...core import get_output_types, recursive_tile, OutputType
  from ...serialization.serializables import AnyField, KeyField, StringField, Int16Field, Int64Field
  from ...typing import TileableType
  from ..operands import DataFrameOperand, DataFrameOperandMixin
  from ..align import align_dataframe_dataframe, align_dataframe_series, align_series_series
  from ..core import IndexValue
  from ..utils import validate_axis, parse_index, build_empty_df
label_desc: Use image node_id 11 for calling the DataFrameAlign obj's underlying member method code with example usage: obj._tile_dataframe_dataframe(cls, op) and returns: nsplits,  l_chunks,  r_chunks