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
- Guard dynamic expressions: `if expr_str.strip(): df.query(expr_str)` else skip.
- Default to a tautology when filtering: use `df.query('index >= 0')` or skip the query when no filter is needed.
- 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
- Strip and check query/eval strings before passing: if expr.strip(): ....
- Default dynamic filters to a tautology or skip the call.
- Validate user-provided expressions for emptiness upstream.
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
- Invalid engine '{engine}' passed, valid engines are {valid_e
- Value must be an instance of {type_repr}
- Value must be one of {pp_values}
- Value must be a nonnegative integer or None
- Value must be a callable
AI-assisted analysis of pandas-dev/pandas@71959b8cb9 (2026-08-07).
Data as JSON: /api/errors/db9d758f0515a7fb.
Report an issue: GitHub.