{"record":{"id":"12d9b33960fa1f8b","repo":"pandas-dev/pandas","slug":"too-many-dims-to-broadcast","errorCode":null,"errorMessage":"too many dims to broadcast","messagePattern":"too many dims to broadcast","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"pandas/core/apply.py","lineNumber":1265,"sourceCode":"            return self.obj._constructor(result, index=self.index, columns=self.columns)\n        else:\n            return self.obj._constructor_sliced(result, index=self.agg_axis)\n\n    def apply_broadcast(self, target: DataFrame) -> DataFrame:\n        assert callable(self.func)\n\n        result_values = np.empty_like(target.values)\n\n        # axis which we want to compare compliance\n        result_compare = target.shape[0]\n\n        for i, col in enumerate(target.columns):\n            res = self.func(target[col], *self.args, **self.kwargs)\n            ares = np.asarray(res).ndim\n\n            # must be a scalar or 1d\n            if ares > 1:\n                raise ValueError(\"too many dims to broadcast\")\n            if ares == 1:\n                # must match return dim\n                if result_compare != len(res):\n                    raise ValueError(\"cannot broadcast result\")\n\n            result_values[:, i] = res\n\n        # we *always* preserve the original index / columns\n        result = self.obj._constructor(\n            result_values, index=target.index, columns=target.columns\n        )\n        return result\n\n    def apply_standard(self):\n        if self.engine == \"python\":\n            results, res_index = self.apply_series_generator()\n        else:\n            results, res_index = self.apply_series_numba()","sourceCodeStart":1247,"sourceCodeEnd":1283,"githubUrl":"https://github.com/pandas-dev/pandas/blob/3b7651241d4da534b3559b60ef128e1c34f54116/pandas/core/apply.py#L1247-L1283","documentation":"Raised inside `apply_broadcast` when the per-column result of the UDF has `ndim > 1` (e.g. a 2-D array or DataFrame). Broadcast mode requires each column's result to be a scalar or a 1-D sequence matching the column length; a higher-dimensional object cannot be placed into the single column slot pandas is filling.","triggerScenarios":"`df.apply(func, result_type='broadcast')` where `func(series)` returns a 2-D numpy array, a DataFrame, or any object whose `np.asarray(...).ndim > 1`.","commonSituations":"UDFs that return multi-column outputs (e.g. `np.outer`, polynomial feature expansions, pairwise computations); UDFs that accidentally stack/expand a 1-D result.","solutions":["Make the UDF return a scalar or 1-D array per column; if it produces multiple columns, do not use `result_type='broadcast'`.","If you need a 2-D output, drop `result_type='broadcast'` and assemble the result frame yourself.","Inspect `np.asarray(func(df[col])).ndim` for each column to find which column violates the contract."],"exampleFix":"// before\ndf.apply(lambda s: np.outer(s, s), result_type='broadcast')\n// after\nout = df.apply(lambda s: np.outer(s, s))  # returns list of 2-D arrays; assemble manually","handlingStrategy":"validation","validationCode":"def broadcast_apply_safe(df, func):\n    import numpy as np\n    for col in df.columns:\n        probe = np.asarray(func(df[col].head(2)))\n        if probe.ndim > 1:\n            raise ValueError(f'{func.__name__} returns {probe.ndim}D for column {col!r}; broadcast requires scalar/1D')\n    return df.apply(func, result_type='broadcast')","typeGuard":"def func_returns_1d_or_scalar(func, series) -> bool:\n    import numpy as np\n    try:\n        return np.asarray(func(series.head(2))).ndim <= 1\n    except Exception:\n        return False","tryCatchPattern":"try:\n    out = df.apply(func, result_type='broadcast')\nexcept ValueError as e:\n    if 'too many dims' in str(e):\n        out = df.apply(func)  # let pandas assemble the 2D result itself\n    else:\n        raise","preventionTips":["Probe each UDF on a 2-row sample and assert ndim <= 1 before broadcast.","Avoid np.outer / polynomial expansions inside broadcast apply.","Prefer returning a DataFrame from a plain apply over broadcast for multi-column outputs."],"tags":["pandas","apply","broadcast","shape-mismatch","valueerror"],"backgroundTag":null,"analyzedSha":"3b7651241d4da534b3559b60ef128e1c34f54116","analyzedAt":"2026-08-11T22:10:44.015Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}