pandas-dev/pandas · error · NameError

name is not defined

Error message

name {self.name!r} is not defined

What it means

Raised in the PyTables Term._resolve_name for the left-hand side when self.name is not present in self.env.queryables. In HDFStore select/where, the left side of a comparison must be a registered queryable — i.e. an index or a column declared as a data_column when the table was written. Columns that exist in the stored frame but were not declared data_columns are not queryable and trigger this NameError.

Solutions

  1. Re-write the table declaring the needed columns as data_columns: store.put('df', df, format='table', data_columns=['B']).
  2. Query only on the index or on previously declared data_columns.
  3. Load the full frame and filter in pandas: df = store.get('df'); df[df['B'] == 1].
  4. Inspect available queryables with store.get_storer('df').non_index_axes and store.get_storer('df').data_columns before querying.

Example fix

// before
store.put('df', df, format='table')
store.select('df', where='B > 1')  # B not a data_column

// after
store.put('df', df, format='table', data_columns=['B'])
store.select('df', where='B > 1')
Defensive patterns

Strategy: validation

Validate before calling

def is_queryable(store, key: str, column: str) -> bool:
    storer = store.get_storer(key)
    queryables = set(storer.data_columns or [])
    queryables.update(storer.non_index_axes[0][1] if storer.non_index_axes else [])
    return column in queryables

assert is_queryable(store, 'df', 'B'), 'B must be a data_column to be queryable'

Type guard

def queryable_columns(store, key: str) -> set:
    storer = store.get_storer(key)
    cols = set(storer.data_columns or [])
    if storer.non_index_axes:
        cols.update(storer.non_index_axes[0][1])
    return cols

Try / catch

try:
    store.select('df', where='B > 1')
except NameError as e:
    if 'is not defined' in str(e):
        # re-write with B as a data_column
        df = store.get('df')
        store.put('df', df, format='table', data_columns=['B'])
        store.select('df', where='B > 1')
    else:
        raise

Prevention

When it happens

Trigger: store.select('df', where='non_existent_column > 5') or store.select('df', where='B == 1') when 'B' was written without being in the data_columns list. Also fires for index misuse: querying a level name that is not actually an index.

Common situations: Writing a DataFrame to HDFStore with pd.HDFStore(...).put('df', df, format='table') without specifying data_columns=['B'], then trying to filter on 'B'. Assuming all stored columns are queryable (only index + declared data_columns are). Renaming a column after write and querying by the new name.

Related errors


AI-assisted analysis of pandas-dev/pandas@3b7651241d (2026-08-11). Data as JSON: /api/errors/25a75872595cf839. Report an issue: GitHub.

Appendix: source

Thrown at pandas/core/computation/pytables.py:91

class Term(ops.Term):
    env: PyTablesScope

    def __new__(cls, name, env, side=None, encoding=None):
        if isinstance(name, str):
            klass = cls
        else:
            klass = Constant
        return object.__new__(klass)

    def __init__(self, name, env: PyTablesScope, side=None, encoding=None) -> None:
        super().__init__(name, env, side=side, encoding=encoding)

    def _resolve_name(self):
        # must be a queryables
        if self.side == "left":
            # Note: The behavior of __new__ ensures that self.name is a str here
            if self.name not in self.env.queryables:
                raise NameError(f"name {self.name!r} is not defined")
            return self.name

        # resolve the rhs (and allow it to be None)
        try:
            return self.env.resolve(self.name, is_local=False)
        except UndefinedVariableError:
            return self.name

    # read-only property overwriting read/write property
    @property  # type: ignore[misc]
    def value(self):
        return self._value


class Constant(Term):
    def __init__(self, name, env: PyTablesScope, side=None, encoding=None) -> None:
        assert isinstance(env, PyTablesScope), type(env)
        super().__init__(name, env, side=side, encoding=encoding)

View on GitHub (pinned to 3b7651241d)