code: def remove_columns(self, column_names, inplace=False):
          
          column_names = list(column_names)
          existing_columns = dict((k, i) for i, k in enumerate(self.column_names()))
  
          for name in column_names:
              if name not in existing_columns:
                  raise KeyError('Cannot find column %s' % name)
  
          # Delete it going backwards so we don't invalidate indices
          deletion_indices = sorted(existing_columns[name] for name in column_names)
  
          if inplace:
              ret = self
          else:
              ret = self.copy()
  
          for colid in reversed(deletion_indices):
              with cython_context():
                  ret.__proxy__.remove_column(colid)
  
          ret._cache = None
          return ret
docs: Returns an SFrame with one or more columns removed.
  
          If inplace == False (default) this operation does not modify the
          current SFrame, returning a new SFrame.
  
          If inplace == True, this operation modifies the current
          SFrame, returning self.
  
          Parameters
          ----------
          column_names : list or iterable
              A list or iterable of column names.
  
          inplace : bool, optional. Defaults to False.
              Whether the SFrame is modified in place.
  
          Returns
          -------
          out : SFrame
              The SFrame with given columns removed.
  
          Examples
          --------
          >>> sf = turicreate.SFrame({'id': [1, 2, 3], 'val1': ['A', 'B', 'C'], 'val2' : [10, 11, 12]})
          >>> res = sf.remove_columns(['val1', 'val2'])
          >>> res
          +----+
          | id |
          +----+
          | 1  |
          | 2  |
          | 3  |
          +----+
          [3 rows x 1 columns]