code: def dropna(  # noqa: C901, PLR0912
      self,
      axis: str = "rows",
      how="any",
      subset: Optional[Iterable[str]] = None,
  ):
      if axis not in ["rows", "cols"]:
          raise ValueError(
              f"Invalid 'axis' value {axis}.Choose one of ['rows', 'cols']"
          )
      if how not in ["any", "all"]:
          raise ValueError(
              f"Invalid 'how' value {how}. Choose one of ['any', 'all']"
          )
  
      match_line: Set = set()
      match_any = True
      if how == "all":
          match_any = False
  
      for n_row, row in enumerate(self):
          for n_col, col in enumerate(row):
              if subset and self.keys()[n_col] not in subset:
                  continue
              if (col == self._fill_value) is match_any:
                  if axis == "rows":
                      match_line.add(n_row)
                      break
                  match_line.add(self.keys()[n_col])
  
      to_drop = match_line
      if how == "all":
          if axis == "rows":
              to_drop = set(range(len(self)))
          else:
              to_drop = set(self.keys())
          to_drop -= match_line
  
      if axis == "rows":
          for name in self.keys():
              self._columns[name] = Column(
                  [
                      x
                      for n, x in enumerate(self._columns[name])
                      if n not in to_drop
                  ]
              )
      else:
          self.drop(*to_drop)
  
imports: from collections import abc
  from itertools import chain, repeat, zip_longest
  from operator import itemgetter
  from typing import TYPE_CHECKING, Any, Dict, ItemsView, Iterable, Iterator, List, Mapping, MutableSequence, Optional, Sequence, Set, Tuple, Union, overload
  from funcy import reraise
label_desc: Use image node_id 31 for calling the TabularData obj's underlying member method code with example usage: obj.dropna(axis, how, subset) without return types