pandas-dev/pandas · error · ValueError

expr cannot be an empty string

Error message

expr cannot be an empty string

What it means

Raised by _check_expression (pandas/core/computation/eval.py:128) as a ValueError when the expression string passed to pd.eval / DataFrame.eval / DataFrame.query is empty (or falsy after string conversion). An empty expression has no meaning and cannot be evaluated, so it is rejected before parsing is attempted.

Source

Thrown at pandas/core/computation/eval.py:128

                )


def _check_expression(expr) -> None:
    """
    Make sure an expression is not an empty string

    Parameters
    ----------
    expr : object
        An object that can be converted to a string

    Raises
    ------
    ValueError
      * If expr is an empty string
    """
    if not expr:
        raise ValueError("expr cannot be an empty string")


def _convert_expression(expr) -> str:
    """
    Convert an object to an expression.

    This function converts an object to an expression (a unicode string) and
    checks to make sure it isn't empty after conversion. This is used to
    convert operators to their string representation for recursive calls to
    :func:`~pandas.eval`.

    Parameters
    ----------
    expr : object
        The object to be converted to a string.

    Returns
    -------

View on GitHub (pinned to 71959b8cb9)

Solutions

  1. Guard dynamic expressions: `if expr_str.strip(): df.query(expr_str)` else skip.
  2. Default to a tautology when filtering: use `df.query('index >= 0')` or skip the query when no filter is needed.
  3. Validate user-provided query strings before passing them to eval/query.

Example fix

# before
expr = build_filter(filters)  # may be ''
df.query(expr)

# after
expr = build_filter(filters)
if expr.strip():
    df = df.query(expr)
Defensive patterns

Strategy: validation

Validate before calling

def safe_query(df, expr):
    if not expr or not expr.strip():
        return df
    return df.query(expr)

Type guard

def is_nonempty_expr(expr) -> bool:
    return isinstance(expr, str) and bool(expr.strip())

Try / catch

try:
    result = df.query(expr)
except ValueError as e:
    if 'empty string' in str(e):
        result = df  # no-op for empty filter
    else:
        raise

Prevention

When it happens

Trigger: `pd.eval('')`, `df.query('')`, `df.eval('')`, or an expression that becomes empty after string conversion (e.g. passing None or whitespace-only in some paths, or a programmatically-built expression that collapsed to '').

Common situations: Building expressions dynamically from empty filters/inputs, stripping user input down to '', or passing a falsy variable unintentionally.

Related errors


AI-assisted analysis of pandas-dev/pandas@71959b8cb9 (2026-08-07). Data as JSON: /api/errors/db9d758f0515a7fb. Report an issue: GitHub.