{"record":{"id":"adf08763ac53470d","repo":"pandas-dev/pandas","slug":"by-row-by-row-not-allowed","errorCode":null,"errorMessage":"by_row={by_row} not allowed","messagePattern":"by_row=(.+?) not allowed","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"pandas/core/apply.py","lineNumber":932,"sourceCode":"\nclass FrameApply(NDFrameApply):\n    obj: DataFrame\n\n    def __init__(\n        self,\n        obj: AggObjType,\n        func: AggFuncType,\n        raw: bool,\n        result_type: str | None,\n        *,\n        by_row: Literal[False, \"compat\"] = False,\n        engine: str = \"python\",\n        engine_kwargs: dict[str, bool] | None = None,\n        args,\n        kwargs,\n    ) -> None:\n        if by_row is not False and by_row != \"compat\":\n            raise ValueError(f\"by_row={by_row} not allowed\")\n        super().__init__(\n            obj,\n            func,\n            raw,\n            result_type,\n            by_row=by_row,\n            engine=engine,\n            engine_kwargs=engine_kwargs,\n            args=args,\n            kwargs=kwargs,\n        )\n\n    # ---------------------------------------------------------------\n    # Abstract Methods\n\n    @property\n    @abc.abstractmethod\n    def result_index(self) -> Index:","sourceCodeStart":914,"sourceCodeEnd":950,"githubUrl":"https://github.com/pandas-dev/pandas/blob/71959b8cb9b2459c16e14b34f28b178ccfe14735/pandas/core/apply.py#L914-L950","documentation":"Raised by `FrameApply.__init__` when `by_row` is passed a value other than `False` or the literal `'compat'`. `by_row` is a narrow internal-compatible flag for DataFrame.apply; users essentially never set it directly, and only those two values are valid for the frame variant (SeriesApply accepts an additional '_compat').","triggerScenarios":"Calling `df.apply(func, by_row=True)` or `df.apply(func, by_row='something')`. Most user-facing code does not pass `by_row` at all; this error indicates the kwarg was set explicitly with an unsupported value.","commonSituations":"Code intended for Series.apply (which has different by_row semantics) reused on a DataFrame; experimental use of the by_row flag without reading its contract; library code that forwards arbitrary kwargs into apply.","solutions":["Omit `by_row` entirely for normal DataFrame.apply usage.","If you must pass it, use exactly `False` or `'compat'`.","Audit where the unsupported `by_row` value originates (often a forwarded kwargs dict)."],"exampleFix":"# before\ndf.apply(my_func, by_row=True)\n# after\ndf.apply(my_func)\n# or explicitly\ndf.apply(my_func, by_row='compat')","handlingStrategy":"validation","validationCode":"def safe_frame_apply(df, func, by_row=None, **kw):\n    if by_row is not None and by_row not in (False, 'compat'):\n        raise ValueError(f\"by_row must be False or 'compat', got {by_row!r}\")\n    return df.apply(func) if by_row is None else df.apply(func, by_row=by_row)","typeGuard":"def is_valid_frame_by_row(v) -> bool:\n    return v in (False, 'compat', None)","tryCatchPattern":"try:\n    df.apply(func, by_row=v)\nexcept ValueError as e:\n    if 'by_row' in str(e):\n        df.apply(func)  # drop by_row\n    else:\n        raise","preventionTips":["Avoid passing `by_row` for DataFrame.apply in user code; it is an internal-compat flag.","Filter forwarded kwargs to remove unsupported keys before calling apply."],"tags":["pandas","apply","by-row","valueerror","dataframe","validation"],"analyzedSha":"71959b8cb9b2459c16e14b34f28b178ccfe14735","analyzedAt":"2026-08-07T01:30:20.476Z","schemaVersion":2},"datasetVersion":"2026-08-07T03:17:09.362Z"}