class_docstr: Perform a database (SQL) merge operation between two DataFrame objects
  using either columns as keys or their row indexes
class_docstr_tok: ["Perform","a","database","(","SQL",")","merge","operation","between","two","DataFrame","objects","using","either","columns","as","keys","or","their","row","indexes"]
code: def __init__(
      self,
      left,
      right,
      how="inner",
      on=None,
      left_on=None,
      right_on=None,
      axis=1,
      left_index=False,
      right_index=False,
      sort=True,
      suffixes=("_x", "_y"),
      copy=True,
      indicator=False,
      validate=None,
  ):
      left = validate_operand(left)
      right = validate_operand(right)
      self.left = self.orig_left = left
      self.right = self.orig_right = right
      self.how = how
      self.axis = axis
  
      self.on = com.maybe_make_list(on)
      self.left_on = com.maybe_make_list(left_on)
      self.right_on = com.maybe_make_list(right_on)
  
      self.copy = copy
      self.suffixes = suffixes
      self.sort = sort
  
      self.left_index = left_index
      self.right_index = right_index
  
      self.indicator = indicator
  
      if isinstance(self.indicator, compat.string_types):
          self.indicator_name = self.indicator
      elif isinstance(self.indicator, bool):
          self.indicator_name = "_merge" if self.indicator else None
      else:
          raise ValueError(
              "indicator option can only accept boolean or string arguments"
          )
  
      if not is_bool(left_index):
          raise ValueError(
              "left_index parameter must be of type bool, not "
              "{left_index}".format(left_index=type(left_index))
          )
      if not is_bool(right_index):
          raise ValueError(
              "right_index parameter must be of type bool, not "
              "{right_index}".format(right_index=type(right_index))
          )
  
      # warn user when merging between different levels
      if left.columns.nlevels != right.columns.nlevels:
          msg = (
              "merging between different levels can give an unintended "
              "result ({left} levels on the left, {right} on the right)"
          ).format(
              left=left.columns.nlevels, right=right.columns.nlevels
          )
          warnings.warn(msg, UserWarning)
  
      self._validate_specification()
  
      # note this function has side effects
      (
          self.left_join_keys,
          self.right_join_keys,
          self.join_names,
      ) = self._get_merge_keys()
  
      # validate the merge keys dtypes. We may need to coerce
      # to avoid incompat dtypes
      self._maybe_coerce_merge_keys()
  
      # If argument passed to validate,
      # check if columns specified as unique
      # are in fact unique.
      if validate is not None:
          self._validate(validate)
  
imports: import copy
  import string
  import warnings
  import numpy
  from pandas._libs import hashtable, join, lib
  import pandas.compat
  from pandas.compat import filter, lzip, map, range, zip
  from pandas.errors import MergeError
  from pandas.util._decorators import Appender, Substitution
  from pandas.core.dtypes.common import ensure_float64, ensure_int64, ensure_object, is_array_like, is_bool, is_bool_dtype, is_categorical_dtype, is_datetime64_dtype, is_datetime64tz_dtype, is_datetimelike, is_dtype_equal, is_extension_array_dtype, is_float_dtype, is_int64_dtype, is_integer, is_integer_dtype, is_list_like, is_number, is_numeric_dtype, is_object_dtype, needs_i8_conversion
  from pandas.core.dtypes.missing import isnull, na_value_for_dtype
  from pandas import Categorical, DataFrame, Index, MultiIndex, Series, Timedelta
  import pandas.core.algorithms
  from pandas.core.arrays.categorical import _recode_for_categories
  import pandas.core.common
  from pandas.core.frame import _merge_doc
  from pandas.core.internals import concatenate_block_managers, items_overlap_with_suffix
  import pandas.core.sorting
  from pandas.core.sorting import is_int64_overflow_possible
label_desc: Use image node_id 1 to create a new _MergeOperation object from inherited base classes: object with example: obj = _MergeOperation(left, right, how, on, left_on, right_on, axis, left_index, right_index, sort, suffixes, copy, indicator, validate)