code: def nunique_dataframe(df, axis=0, dropna=True, combine_size=None):
      """
      Count distinct observations over requested axis.
  
      Return Series with number of distinct observations. Can ignore NaN
      values.
  
      Parameters
      ----------
      axis : {0 or 'index', 1 or 'columns'}, default 0
          The axis to use. 0 or 'index' for row-wise, 1 or 'columns' for
          column-wise.
      dropna : bool, default True
          Don't include NaN in the counts.
      combine_size : int, optional
          The number of chunks to combine.
  
      Returns
      -------
      Series
  
      See Also
      --------
      Series.nunique: Method nunique for Series.
      DataFrame.count: Count non-NA cells for each column or row.
  
      Examples
      --------
      >>> import mars.dataframe as md
      >>> df = md.DataFrame({'A': [1, 2, 3], 'B': [1, 1, 1]})
      >>> df.nunique().execute()
      A    3
      B    1
      dtype: int64
  
      >>> df.nunique(axis=1).execute()
      0    1
      1    2
      2    2
      dtype: int64
      """
      op = DataFrameNunique(
          axis=axis,
          dropna=dropna,
          combine_size=combine_size,
          output_types=[OutputType.series],
          use_arrow_dtype=options.dataframe.use_arrow_dtype,
      )
      return op(df)
  
imports: import pandas
  from ...None import opcodes
  from ...core import OutputType
  from ...config import options
  from ...serialization.serializables import BoolField
  from ...utils import lazy_import
  from ..arrays import ArrowListArray, ArrowListDtype
  from .core import DataFrameReductionOperand, DataFrameReductionMixin, CustomReduction
label_desc: Use image node_id 1 for calling a global function with example usage: nunique_dataframe(df, axis, dropna, combine_size) and returns: op