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
- Re-write the table declaring the needed columns as data_columns: store.put('df', df, format='table', data_columns=['B']).
- Query only on the index or on previously declared data_columns.
- Load the full frame and filter in pandas: df = store.get('df'); df[df['B'] == 1].
- 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
- Declare data_columns explicitly at write time for every column you intend to filter on.
- Inspect storer.data_columns before constructing where clauses.
- Prefer Parquet with predicate pushdown for new code.
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
- arithmetic operations are not supported inside an HDFStore…
- Cannot compare of type to column
- cannot subscript with
- cannot use an invert condition when passing to numexpr
- passing a filterable condition to a non-table indexer
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)