class_docstr: This is a wrapper class of luigi.Task.
  
  The key methods of a TaskOnKart are:
  
  * :py:meth:`make_target` - this makes output target with a relative file path.
  * :py:meth:`make_model_target` - this makes output target for models which generate multiple files to save.
  * :py:meth:`load` - this loads input files of this task.
  * :py:meth:`dump` - this save a object as output of this task.
class_docstr_tok: ["This","is","a","wrapper","class","of","luigi.Task",".","The","key","methods","of","a","TaskOnKart","are",":","*",":","py",":","meth",":","`","make_target","`","-","this","makes","output","target","with","a","relative","file","path",".","*",":","py",":","meth",":","`","make_model_target","`","-","this","makes","output","target","for","models","which","generate","multiple","files","to","save",".","*",":","py",":","meth",":","`","load","`","-","this","loads","input","files","of","this","task",".","*",":","py",":","meth",":","`","dump","`","-","this","save","a","object","as","output","of","this","task","."]
code: def load_data_frame(
      self,
      target: Union[None, str, TargetOnKart] = None,
      required_columns: Optional[Set[str]] = None,
      drop_columns: bool = False,
  ) -> pd.DataFrame:
      def _flatten_recursively(dfs):
          if isinstance(dfs, list):
              return pd.concat([_flatten_recursively(df) for df in dfs])
          else:
              return dfs
  
      dfs = self.load(target=target)
      if isinstance(dfs, dict) and len(dfs) == 1:
          dfs = list(dfs.values())[0]
  
      data = _flatten_recursively(dfs)
  
      required_columns = required_columns or set()
      if (
          data.empty
          and len(data.index) == 0
          and len(required_columns - set(data.columns)) > 0
      ):
          return pd.DataFrame(columns=list(required_columns))
      assert required_columns.issubset(
          set(data.columns)
      ), f"data must have columns {required_columns}, but actually have only {data.columns}."
      if drop_columns:
          data = data[list(required_columns)]
      return data
  
imports: import hashlib
  import inspect
  import os
  import types
  from importlib import import_module
  from logging import getLogger
  from typing import Any, Callable, Dict, List, Optional, Set, Union
  import luigi
  import pandas
  from luigi.parameter import ParameterVisibility
  import gokart
  from gokart.file_processor import FileProcessor
  from gokart.pandas_type_config import PandasTypeConfigMap
  from gokart.parameter import ExplicitBoolParameter, ListTaskInstanceParameter, TaskInstanceParameter
  from gokart.redis_lock import make_redis_params
  from gokart.target import TargetOnKart
  from gokart.task_complete_check import task_complete_check_wrapper
label_desc: Use image node_id 15 for calling the TaskOnKart obj's underlying member method code with example usage: obj.load_data_frame(target, required_columns, drop_columns) and returns: data, pd, pd, dfs