code: def execute(cls, ctx, op):
      restore_func(ctx, op)
      input_data = ctx[op.inputs[0].key]
      out = op.outputs[0]
      if len(input_data) == 0:
          if op.output_types[0] == OutputType.dataframe:
              ctx[out.key] = build_empty_df(out.dtypes)
          else:
              ctx[out.key] = build_empty_series(
                  out.dtype, name=out.name
              )
          return
  
      if isinstance(input_data, pd.DataFrame):
          result = input_data.apply(
              op.func,
              axis=op.axis,
              raw=op.raw,
              result_type=op.result_type,
              args=op.args,
              **op.kwds,
          )
      else:
          try:
              result = input_data.apply(
                  op.func,
                  convert_dtype=op.convert_dtype,
                  args=op.args,
                  **op.kwds,
              )
          except TypeError:
              if isinstance(input_data.values, ArrowArray):
                  input_data = pd.Series(
                      input_data.to_numpy(),
                      name=input_data.name,
                      index=input_data.index,
                  )
                  result = input_data.apply(
                      op.func,
                      convert_dtype=op.convert_dtype,
                      args=op.args,
                      **op.kwds,
                  )
              else:  # pragma: no cover
                  raise
      ctx[out.key] = result
  
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 18 for calling the ApplyOperand obj's underlying member method code with example usage: obj.execute(cls, ctx, op) without return types