{"record":{"id":"935c5e1e41d0ee1e","repo":"reflex-dev/reflex","slug":"serialized-dataframe-should-be-a-dict","errorCode":null,"errorMessage":"Serialized dataframe should be a dict.","messagePattern":"Serialized dataframe should be a dict\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"packages/reflex-components-gridjs/src/reflex_components_gridjs/datatable.py","lineNumber":123,"sourceCode":"        \"\"\"\n        return {\"\": \"gridjs/dist/theme/mermaid.css\"}\n\n    def _render(self) -> Tag:\n        if isinstance(self.data, Var) and types.is_dataframe(self.data._var_type):\n            self.columns = self.data._replace(\n                _js_expr=f\"{self.data._js_expr}.columns\",\n                _var_type=list[Any],\n            )\n            self.data = self.data._replace(\n                _js_expr=f\"{self.data._js_expr}.data\",\n                _var_type=list[list[Any]],\n            )\n        if types.is_dataframe(type(self.data)):\n            # If given a pandas df break up the data and columns\n            data = serialize(self.data)\n            if not isinstance(data, dict):\n                msg = \"Serialized dataframe should be a dict.\"\n                raise ValueError(msg)\n            self.columns = LiteralVar.create(data[\"columns\"])\n            self.data = LiteralVar.create(data[\"data\"])\n\n        # Render the table.\n        return super()._render()\n","sourceCodeStart":105,"sourceCodeEnd":129,"githubUrl":"https://github.com/reflex-dev/reflex/blob/45b8ed5ab735f8a56bbb09a42384f030eb0208e7/packages/reflex-components-gridjs/src/reflex_components_gridjs/datatable.py#L105-L129","documentation":"Internally, data_table serializes a pandas DataFrame via serialize(), expecting a dict with 'data' and 'columns' keys. If a custom serializer or DataFrame format returns something else, this invariant error fires.","triggerScenarios":"Passing a DataFrame whose serialize() output is not a dict — e.g. a custom pandas subclass or overridden serialization hook in the app.","commonSituations":"Rare; usually caused by using non-standard DataFrame wrappers or an incompatible reflex/radix serialization version.","solutions":["Pass a vanilla pandas DataFrame (convert subclasses via pd.DataFrame(df))","Or pre-convert: pass data=df.to_dict('records') style list plus explicit columns","Check for mismatched reflex package versions and uv sync","Report upstream if a plain DataFrame triggers it"],"exampleFix":"# before\nrx.data_table(data=CustomDF subclass_instance)\n# after\nrx.data_table(data=pd.DataFrame(subclass_instance))","handlingStrategy":"try-catch","validationCode":"from reflex.utils import serialize\nassert isinstance(serialize(pd.DataFrame(df)), dict), 'unexpected serializer output'","typeGuard":null,"tryCatchPattern":"try:\n    comp = rx.data_table(data=df)\nexcept ValueError as e:\n    if 'Serialized dataframe' in str(e):\n        comp = rx.data_table(data=df.to_dict('records'), columns=list(df.columns))\n    else:\n        raise","preventionTips":["Convert DataFrame subclasses to plain pd.DataFrame","Keep reflex workspace packages version-synced (uv sync)"],"tags":["reflex","gridjs","serialization"],"backgroundTag":"serialization-format-mismatch","analyzedSha":"45b8ed5ab735f8a56bbb09a42384f030eb0208e7","analyzedAt":"2026-08-28T19:25:27.644Z","schemaVersion":2},"datasetVersion":"2026-08-28T21:17:43.275Z"}