{"record":{"id":"9067609a76259a6f","repo":"pandas-dev/pandas","slug":"dtype-self-dtype-does-not-support-operation-906760","errorCode":null,"errorMessage":"dtype '{self.dtype}' does not support operation '{how}'","messagePattern":"dtype '(.+?)' does not support operation '(.+?)'","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"pandas/core/arrays/base.py","lineNumber":3076,"sourceCode":"        op = WrappedCythonOp(how=how, kind=kind, has_dropped_na=has_dropped_na)\n\n        initial: Any = 0\n        # GH#43682\n        if isinstance(self.dtype, StringDtype):\n            # StringArray\n            if op.how in [\n                \"prod\",\n                \"mean\",\n                \"median\",\n                \"cumsum\",\n                \"cumprod\",\n                \"std\",\n                \"sem\",\n                \"var\",\n                \"skew\",\n                \"kurt\",\n            ]:\n                raise TypeError(\n                    f\"dtype '{self.dtype}' does not support operation '{how}'\"\n                )\n            if op.how not in [\"any\", \"all\"]:\n                # Fail early to avoid conversion to object\n                op._get_cython_function(op.kind, op.how, np.dtype(object), False)\n\n            arr = self\n            if op.how == \"sum\":\n                initial = \"\"\n                # https://github.com/pandas-dev/pandas/issues/60229\n                # All NA should result in the empty string.\n                assert \"skipna\" in kwargs\n                if kwargs[\"skipna\"] and min_count == 0:\n                    arr = arr.fillna(\"\")\n            npvalues = arr.to_numpy(object, na_value=np.nan)\n        else:\n            raise NotImplementedError(\n                f\"function is not implemented for this dtype: {self.dtype}\"","sourceCodeStart":3058,"sourceCodeEnd":3094,"githubUrl":"https://github.com/pandas-dev/pandas/blob/71959b8cb9b2459c16e14b34f28b178ccfe14735/pandas/core/arrays/base.py#L3058-L3094","documentation":"Inside ExtensionArray._groupby_op (base.py:3076), a StringDtype array explicitly rejects a fixed list of non-sensical aggregations (prod, mean, median, cumsum, cumprod, std, sem, var, skew, kurt) with TypeError. Strings have no numeric meaning for these ops, so pandas fails fast rather than coercing to object.","triggerScenarios":"Calling df.groupby(key).prod()/.mean()/.median()/.cumsum()/.std()/.var()/.sem()/.skew()/.kurt() (or Series groupby equivalents) on a 'string'-dtype column, or on a DataFrame whose only columns are string dtype.","commonSituations":"Applying df.groupby(...).mean() across a DataFrame that still has unconverted string columns; aggregating identifiers stored as strings; pipelines that assume all columns are numeric.","solutions":["Pass numeric_only=True to the groupby aggregation so string columns are skipped.","Select numeric columns before grouping: df.groupby(key)[numeric_cols].mean().","Convert genuinely numeric string data with astype('Float64') before the aggregation.","Drop the string column from the groupby target."],"exampleFix":"# before\ndf.groupby(\"id\").mean()  # raises if other cols are 'string'\n\n# after\ndf.groupby(\"id\").mean(numeric_only=True)","handlingStrategy":"validation","validationCode":"def safe_groupby_agg(df, key, op):\n    import pandas as pd\n    if df.select_dtypes(exclude=\"number\").shape[1]:\n        return getattr(df.groupby(key), op)(numeric_only=True)\n    return getattr(df.groupby(key), op)()","typeGuard":"def is_string_dtype_col(dtype) -> bool:\n    import pandas as pd\n    return dtype == \"string\" or pd.api.types.is_string_dtype(dtype)","tryCatchPattern":"try:\n    df.groupby(\"id\").mean()\nexcept TypeError as e:\n    if \"does not support operation\" in str(e):\n        df.groupby(\"id\").mean(numeric_only=True)\n    else:\n        raise","preventionTips":["Pass numeric_only=True on groupby aggregations","Convert string-encoded numbers before aggregating","Select numeric columns before groupby ops"],"tags":["groupby","string-dtype","aggregation","dtype-mismatch"],"analyzedSha":"71959b8cb9b2459c16e14b34f28b178ccfe14735","analyzedAt":"2026-08-07T01:30:20.476Z","schemaVersion":2},"datasetVersion":"2026-08-07T03:17:09.362Z"}