code: def left_join(left, right, on=None, suffixes=('_x', '_y'), mapjoin=False, merge_columns=None):
      
      joined = join(left, right, on, how='left', suffixes=suffixes, mapjoin=mapjoin)
      return joined._merge_joined_fields(merge_columns)
docs: Left join two collections.
  
      If `on` is not specified, we will find the common fields of the left and right collection.
      `suffixes` means that if column names conflict, the suffixes will be added automatically.
      For example, both left and right has a field named `col`,
      there will be col_x, and col_y in the joined collection.
  
      :param left: left collection
      :param right: right collection
      :param on: fields to join on
      :param suffixes: when name conflict, the suffixes will be added to both columns.
      :param mapjoin: set use mapjoin or not, default value False.
      :param merge_columns: whether to merge columns with the same name into one column without suffix.
                            If the value is True, columns in the predicate with same names will be merged,
                            with non-null value. If the value is 'left' or 'right', the values of predicates
                            on the left / right collection will be taken. You can also pass a dictionary to
                            describe the behavior of each column, such as { 'a': 'auto', 'b': 'left' }.
      :return: collection
  
      :Example:
  
      >>> df.dtypes.names
      ['name', 'id']
      >>> df2.dtypes.names
      ['name', 'id1']
      >>> df.left_join(df2)
      >>> df.left_join(df2, on='name')
      >>> df.left_join(df2, on=('id', 'id1'))
      >>> df.left_join(df2, on=['name', ('id', 'id1')])
      >>> df.left_join(df2, on=[df.name == df2.name, df.id == df2.id1])