code: def notna(obj):
      """
      Detect existing (non-missing) values.
  
      Return a boolean same-sized object indicating if the values are not NA.
      Non-missing values get mapped to True. NA values, such as None or
      :attr:`numpy.NaN`, get mapped to False values.
  
      Returns
      -------
      bool or array-like of bool
          Mask of bool values for each element that
          indicates whether an element is not an NA value.
  
      See Also
      --------
      isna : Detect missing values for an array-like object.
      Series.notna : Boolean inverse of Series.isna.
      DataFrame.notnull : Boolean inverse of DataFrame.isnull.
      Index.notna : Boolean inverse of Index.isna.
      Index.notnull : Boolean inverse of Index.isnull.
  
      Examples
      --------
      Show which entries in a DataFrame are not NA.
  
      >>> df = ps.DataFrame({'age': [5, 6, np.NaN],
      ...                    'born': [pd.NaT, pd.Timestamp('1939-05-27'),
      ...                             pd.Timestamp('1940-04-25')],
      ...                    'name': ['Alfred', 'Batman', ''],
      ...                    'toy': [None, 'Batmobile', 'Joker']})
      >>> df
         age       born    name        toy
      0  5.0        NaT  Alfred       None
      1  6.0 1939-05-27  Batman  Batmobile
      2  NaN 1940-04-25              Joker
  
      >>> df.notnull()
           age   born  name    toy
      0   True  False  True  False
      1   True   True  True   True
      2  False   True  True   True
  
      Show which entries in a Series are not NA.
  
      >>> ser = ps.Series([5, 6, np.NaN])
      >>> ser
      0    5.0
      1    6.0
      2    NaN
      dtype: float64
  
      >>> ps.notna(ser)
      0     True
      1     True
      2    False
      dtype: bool
  
      >>> ps.notna(ser.index)
      True
      """
      # TODO: Add back:
      #     Series.notnull :Boolean inverse of Series.isnull.
      #     DataFrame.notna :Boolean inverse of DataFrame.isna.
      #   into the See Also in the docstring. It does not find the method in the latest numpydoc.
      if isinstance(obj, (DataFrame, Series)):
          return obj.notna()
      else:
          return pd.notna(obj)
  
imports: from typing import Any, Callable, Dict, List, Optional, Set, Sized, Tuple, Type, Union, cast, no_type_check
  from collections.abc import Iterable
  from datetime import tzinfo
  from functools import reduce
  from io import BytesIO
  import json
  import warnings
  import numpy
  import pandas
  from pandas.api.types import is_datetime64_dtype, is_list_like
  from pandas.tseries.offsets import DateOffset
  import pyarrow
  import pyarrow.parquet
  from pyspark.sql import functions, Column
  from pyspark.sql.functions import pandas_udf
  from pyspark.sql.types import ByteType, ShortType, IntegerType, LongType, FloatType, DoubleType, BooleanType, TimestampType, TimestampNTZType, DecimalType, StringType, DateType, StructType, DataType
  from pyspark.sql.dataframe import DataFrame
  from pyspark import pandas
  from pyspark.pandas._typing import Axis, Dtype, Label, Name
  from pyspark.pandas.base import IndexOpsMixin
  from pyspark.pandas.utils import align_diff_frames, default_session, is_name_like_tuple, is_name_like_value, name_like_string, same_anchor, scol_for, validate_axis, log_advice
  from pyspark.pandas.frame import DataFrame, _reduce_spark_multi
  from pyspark.pandas.internal import InternalFrame, DEFAULT_SERIES_NAME, HIDDEN_COLUMNS, SPARK_INDEX_NAME_FORMAT
  from pyspark.pandas.series import Series, first_series
  from pyspark.pandas.spark.utils import as_nullable_spark_type, force_decimal_precision_scale
  from pyspark.pandas.indexes import Index, DatetimeIndex, TimedeltaIndex
  from pyspark.pandas.indexes.multi import MultiIndex
  from pyspark.sql.utils import get_column_class
label_desc: Use image node_id 23 for calling a global function with example usage: notna(obj) and returns: obj, pd