def drop_field(expr, field, *fields):
    """Drop a field or fields from a tabular expression.

    Parameters
    ----------
    expr : Expr
        A tabular expression to drop columns from.
    *fields
       The names of the fields to drop.

    Returns
    -------
    dropped : Expr
       The new tabular expression with some columns missing.

    Raises
    ------
    TypeError
        Raised when ``expr`` is not tabular.
    ValueError
        Raised when a column is not in the fields of ``expr``.

    See Also
    --------
    :func:`blaze.expr.expressions.projection`
    """
    to_remove = set((field,)).union(fields)
    new_fields = []
    for field in expr.fields:
        if field not in to_remove:
            new_fields.append(field)
        else:
            to_remove.remove(field)

    if to_remove:
        raise ValueError(
            'fields %r were not in the fields of expr (%r)' % (
                sorted(to_remove),
                expr.fields
            ),
        )
    return expr[new_fields]