{"record":{"id":"3f956cf17f8df33d","repo":"pandas-dev/pandas","slug":"column-not-found-key","errorCode":null,"errorMessage":"Column not found: {key}","messagePattern":"Column not found: (.+?)","errorType":"exception","errorClass":"KeyError","httpStatus":null,"severity":"error","filePath":"pandas/core/base.py","lineNumber":224,"sourceCode":"\n        if len(self.exclusions) > 0:\n            return self.obj._drop_axis(self.exclusions, axis=1)\n        else:\n            return self.obj\n\n    def __getitem__(self, key):\n        if self._selection is not None:\n            raise IndexError(f\"Column(s) {self._selection} already selected\")\n\n        if isinstance(key, (list, tuple, ABCSeries, ABCIndex, np.ndarray)):\n            if len(self.obj.columns.intersection(key)) != len(set(key)):\n                bad_keys = list(set(key).difference(self.obj.columns))\n                raise KeyError(f\"Columns not found: {str(bad_keys)[1:-1]}\")\n            return self._gotitem(list(key), ndim=2)\n\n        else:\n            if key not in self.obj:\n                raise KeyError(f\"Column not found: {key}\")\n            ndim = self.obj[key].ndim\n            return self._gotitem(key, ndim=ndim)\n\n    def _gotitem(self, key, ndim: int, subset=None):\n        \"\"\"\n        sub-classes to define\n        return a sliced object\n\n        Parameters\n        ----------\n        key : str / list of selections\n        ndim : {1, 2}\n            requested ndim of result\n        subset : object, default None\n            subset to act on\n        \"\"\"\n        raise AbstractMethodError(self)\n","sourceCodeStart":206,"sourceCodeEnd":242,"githubUrl":"https://github.com/pandas-dev/pandas/blob/71959b8cb9b2459c16e14b34f28b178ccfe14735/pandas/core/base.py#L206-L242","documentation":"Raised by SelectionMixin.__getitem__ for a single (scalar) key that is not present in obj. The scalar branch complements the list branch (476); reports the missing key.","triggerScenarios":"`df.groupby('g')['nonexistent']`; selecting a single missing column on a SelectionMixin holder.","commonSituations":"Case sensitivity in column names; renamed columns; trailing whitespace in headers.","solutions":["Print obj.columns to verify the exact name.","Strip/normalize column names at load: `df.columns = df.columns.str.strip()`.","Use df.get('key') for optional access."],"exampleFix":"// before\ng = df.groupby('g')['Revenue']  # actual: 'revenue'\n\n// after\ndf.columns = df.columns.str.lower().str.strip()\ng = df.groupby('g')['revenue']","handlingStrategy":"validation","validationCode":"if key not in obj.columns:\n    raise KeyError(f'Column not found: {key}; available: {list(obj.columns)}')","typeGuard":"def column_exists(df, key) -> bool:\n    return key in df.columns","tryCatchPattern":"try:\n    sub = holder[key]\nexcept KeyError as e:\n    if 'Column not found' in str(e):\n        candidates = [c for c in obj.columns if str(c).lower() == str(key).lower()]\n        sub = holder[candidates[0]] if candidates else None\n    else:\n        raise","preventionTips":["Normalize column names (case, whitespace) at load.","Print available columns when debugging.","Use df.get(key) for optional access."],"tags":["selection","groupby","keyerror","columns"],"analyzedSha":"71959b8cb9b2459c16e14b34f28b178ccfe14735","analyzedAt":"2026-08-07T01:30:20.476Z","schemaVersion":2},"datasetVersion":"2026-08-07T03:17:09.362Z"}