{"record":{"id":"81e47015614b963f","repo":"pandas-dev/pandas","slug":"cannot-perform-reduction-name-with-string-dtyp","errorCode":null,"errorMessage":"Cannot perform reduction '{name}' with string dtype","messagePattern":"Cannot perform reduction '(.+?)' with string dtype","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"pandas/core/arrays/string_.py","lineNumber":978,"sourceCode":"        skipna: bool = True,\n        keepdims: bool = False,\n        axis: AxisInt | None = 0,\n        **kwargs,\n    ):\n        if self.dtype.na_value is np.nan and name in [\"any\", \"all\"]:\n            if name == \"any\":\n                return nanops.nanany(self._ndarray, skipna=skipna)\n            else:\n                return nanops.nanall(self._ndarray, skipna=skipna)\n        elif name == \"count\":\n            return super().count()\n        elif name in [\"min\", \"max\", \"argmin\", \"argmax\", \"sum\"]:\n            result = getattr(self, name)(skipna=skipna, axis=axis, **kwargs)\n            if keepdims:\n                return self._from_sequence([result], dtype=self.dtype)\n            return result\n\n        raise TypeError(f\"Cannot perform reduction '{name}' with string dtype\")\n\n    def _accumulate(self, name: str, *, skipna: bool = True, **kwargs) -> StringArray:\n        \"\"\"\n        Return an ExtensionArray performing an accumulation operation.\n\n        The underlying data type might change.\n\n        Parameters\n        ----------\n        name : str\n            Name of the function, supported values are:\n            - cummin\n            - cummax\n            - cumsum\n            - cumprod\n        skipna : bool, default True\n            If True, skip NA values.\n        **kwargs","sourceCodeStart":960,"sourceCodeEnd":996,"githubUrl":"https://github.com/pandas-dev/pandas/blob/3b7651241d4da534b3559b60ef128e1c34f54116/pandas/core/arrays/string_.py#L960-L996","documentation":"StringArray._reduce raises TypeError for any reduction name not in the supported set (any, all, count, min, max, argmin, argmax, sum). String data has no meaningful numeric mean, median, std, prod, or sem, so pandas refuses rather than coerce strings to numbers and silently return NaN.","triggerScenarios":"Calling df.mean(), df.median(), df.std(), df.var(), df.prod(), df.sem(), df.skew(), or df.kurt() on a column whose dtype is 'string' or 'string[pyarrow]'; also df._reduce('median') directly on a StringArray.","commonSituations":"A pipeline computes describe() or a fixed list of aggregations over every column without filtering dtypes; a CSV inferred as strings where numbers were expected; mixing categorical labels and numeric columns and calling mean() across the frame.","solutions":["Filter numeric columns before reducing: df.select_dtypes('number').mean().","Convert the column to numeric first: pd.to_numeric(df['col'], errors='coerce').mean().","If strings encode numbers, strip/cast explicitly then reduce.","Limit reductions to the supported set (count, min, max, sum, any, all) on string columns."],"exampleFix":"// before\ns = pd.Series(['1','2','3'], dtype='string')\ns.mean()  # TypeError\n// after\npd.to_numeric(s, errors='coerce').mean()  # 2.0","handlingStrategy":"type-guard","validationCode":"def safe_reduce(s, name):\n    if pd.api.types.is_string_dtype(s):\n        if name not in {'count','min','max','sum','argmin','argmax','any','all'}:\n            raise TypeError(f\"Reduction '{name}' not defined for string dtype\")\n    return getattr(s, name)()","typeGuard":"def is_numeric_reduce_safe(series) -> bool:\n    return pd.api.types.is_numeric_dtype(series)","tryCatchPattern":"try:\n    df.mean()\nexcept TypeError as e:\n    if 'string dtype' in str(e):\n        df.select_dtypes('number').mean()\n    else:\n        raise","preventionTips":["Filter numeric columns before applying numeric reductions.","Validate dtypes of columns targeted by mean/median/std.","Convert string-encoded numbers with pd.to_numeric before reducing."],"tags":["pandas","string-array","reduction","mean","dtype"],"backgroundTag":null,"analyzedSha":"3b7651241d4da534b3559b60ef128e1c34f54116","analyzedAt":"2026-08-11T22:10:44.015Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}