{"record":{"id":"40671dcd981af9cd","repo":"pandas-dev/pandas","slug":"expression-objects-are-not-iterable","errorCode":null,"errorMessage":"Expression objects are not iterable","messagePattern":"Expression objects are not iterable","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"pandas/core/col.py","lineNumber":360,"sourceCode":"                    condition = condition._eval_expression(df)\n                if isinstance(replacement, Expression):\n                    replacement = replacement._eval_expression(df)\n                evaluated.append((condition, replacement))\n            return ser.case_when(evaluated)\n\n        # Keep repr compact; caselist may be large.\n        repr_str = f\"{self!r}.case_when(...)\"\n        return Expression(func, repr_str)\n\n    def __repr__(self) -> str:\n        return self._repr_str or \"Expr(...)\"\n\n    # Unsupported ops\n    def __bool__(self) -> NoReturn:\n        raise TypeError(\"boolean value of an expression is ambiguous\")\n\n    def __iter__(self) -> NoReturn:\n        raise TypeError(\"Expression objects are not iterable\")\n\n    def __copy__(self) -> NoReturn:\n        raise TypeError(\"Expression objects are not copiable\")\n\n    def __deepcopy__(self, memo: dict[int, Any] | None) -> NoReturn:\n        raise TypeError(\"Expression objects are not copiable\")\n\n\n@set_module(\"pandas\")\ndef col(col_name: Hashable) -> Expression:\n    \"\"\"\n    Generate deferred object representing a column of a DataFrame.\n\n    Any place which accepts ``lambda df: df[col_name]``, such as\n    :meth:`DataFrame.assign` or :meth:`DataFrame.loc`, can also accept\n    ``pd.col(col_name)``.\n\n    .. versionadded:: 3.0.0","sourceCodeStart":342,"sourceCodeEnd":378,"githubUrl":"https://github.com/pandas-dev/pandas/blob/71959b8cb9b2459c16e14b34f28b178ccfe14735/pandas/core/col.py#L342-L378","documentation":"Raised by Expression.__iter__ (pandas/core/col.py:360). An Expression is a deferred, unevaluated reference to a column; it has no elements to iterate over until it is evaluated against a concrete DataFrame. Iteration (`for x in expr`, `list(expr)`, `*expr`) is therefore unsupported.","triggerScenarios":"`for v in pd.col('x'):`, `list(pd.col('x'))`, `[*pd.col('x')]`, or unpacking `a, b = pd.col('x')`. Passing an Expression to a function that iterates its argument (sum, map, list, tuple, set).","commonSituations":"Assuming `pd.col('x')` returns the column's values directly. Mixing deferred Expression objects into generic collection-handling helpers that iterate inputs.","solutions":["Evaluate against a DataFrame first and iterate the resulting Series: `for v in df['x']:`.","If you need the underlying values, call the expression's bound form or use `df['x'].tolist()`.","Restrict pd.col usage to assign/loc/query/pipe which evaluate the deferred callable."],"exampleFix":"# before\nexpr = pd.col('name')\nfor name in expr:\n    ...\n\n# after\nfor name in df['name']:\n    ...","handlingStrategy":"type-guard","validationCode":"from pandas.core.col import Expression\n\ndef to_iterable(obj, df):\n    if isinstance(obj, Expression):\n        return obj._eval_expression(df)\n    return obj","typeGuard":"from pandas.core.col import Expression\n\ndef is_expression(obj) -> bool:\n    return isinstance(obj, Expression)","tryCatchPattern":"try:\n    values = list(expr)\nexcept TypeError as e:\n    if 'not iterable' in str(e):\n        values = df[expr._eval_expression(df).name].tolist()\n    else:\n        raise","preventionTips":["Evaluate pd.col expressions against a DataFrame before iterating.","Keep Expressions confined to assign/loc/query/pipe call sites.","Iterate df[col] directly when you need values."],"tags":["expression","pd-col","iteration","deferred","typeerror"],"analyzedSha":"71959b8cb9b2459c16e14b34f28b178ccfe14735","analyzedAt":"2026-08-07T01:30:20.476Z","schemaVersion":2},"datasetVersion":"2026-08-07T03:17:09.362Z"}