code: def partition_merge_data(
      cls, op, need_align, return_value, partition_chunks, proxy_chunk
  ):
      # stage 4: all *ith* classes are gathered and merged
      (
          partition_sort_chunks,
          partition_indices_chunks,
          sort_info_chunks,
      ) = ([], [], [])
      for i, partition_chunk in enumerate(partition_chunks):
          kind = None if op.psrs_kinds is None else op.psrs_kinds[2]
          partition_shuffle_reduce = DataFramePSRSShuffle(
              stage=OperandStage.reduce,
              kind=kind,
              reducer_index=(i,),
              n_reducers=len(partition_chunks),
              output_types=op.output_types,
              **cls._collect_op_properties(op),
          )
          chunk_shape = list(partition_chunk.shape)
          chunk_shape[op.axis] = np.nan
  
          kw = dict(
              shape=tuple(chunk_shape),
              index=partition_chunk.index,
              index_value=partition_chunk.index_value,
          )
          if op.outputs[0].ndim == 2:
              kw.update(
                  dict(
                      columns_value=partition_chunk.columns_value,
                      dtypes=partition_chunk.dtypes,
                  )
              )
          else:
              kw.update(
                  dict(
                      dtype=partition_chunk.dtype,
                      name=partition_chunk.name,
                  )
              )
          cs = partition_shuffle_reduce.new_chunks([proxy_chunk], **kw)
  
          partition_sort_chunks.append(cs[0])
      return (
          partition_sort_chunks,
          partition_indices_chunks,
          sort_info_chunks,
      )
  
imports: import os
  import numpy
  import pandas
  from ...None import opcodes
  from ...core.operand import OperandStage, MapReduceOperand
  from ...utils import lazy_import, calc_nsplits
  from ...serialization.serializables import AnyField, Int32Field, ListField, StringField, BoolField
  from ...tensor.base.psrs import PSRSOperandMixin
  from ..core import IndexValue, OutputType
  from ..utils import standardize_range_index, parse_index, is_cudf
  from ..operands import DataFrameOperandMixin, DataFrameOperand, DataFrameShuffleProxy
label_desc: Use image node_id 5 for calling the DataFramePSRSOperandMixin obj's underlying member method code with example usage: obj.partition_merge_data(cls, op, need_align, return_value, partition_chunks, proxy_chunk) and returns: partition_sort_chunks,  partition_indices_chunks,  sort_info_chunks