{"record":{"id":"4233d6b1e6b45dd7","repo":"pandas-dev/pandas","slug":"cannot-perform-reduction-name-with-string-dtyp-4233d6","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_arrow.py","lineNumber":640,"sourceCode":"        nv.validate_minmax_axis(axis, self.ndim)\n        if self.dtype.na_value is np.nan and name in [\"any\", \"all\"]:\n            if not skipna:\n                nas = pc.is_null(self._pa_array)\n                arr = pc.or_kleene(nas, pc.not_equal(self._pa_array, \"\"))\n            else:\n                arr = pc.not_equal(self._pa_array, \"\")\n            result = ArrowExtensionArray(arr)._reduce(\n                name, skipna=skipna, keepdims=keepdims, **kwargs\n            )\n            if keepdims:\n                # ArrowExtensionArray will return a length-1 bool[pyarrow] array\n                return result.astype(np.bool_)\n            return result\n\n        if name in (\"count\", \"min\", \"max\", \"sum\", \"argmin\", \"argmax\"):\n            result = self._reduce_calc(name, skipna=skipna, keepdims=keepdims, **kwargs)\n        else:\n            raise TypeError(f\"Cannot perform reduction '{name}' with string dtype\")\n\n        if name in (\"argmin\", \"argmax\") and isinstance(result, pa.Array):\n            return self._convert_int_result(result)\n        elif isinstance(result, pa.Array):\n            return type(self)(result, dtype=self.dtype)\n        else:\n            return result\n\n    def value_counts(self, dropna: bool = True) -> Series:\n        result = super().value_counts(dropna=dropna)\n        if self.dtype.na_value is np.nan:\n            res_values = result._values.to_numpy()\n            return result._constructor(\n                res_values, index=result.index, name=result.name, copy=False\n            )\n        return result\n\n    def _cmp_method(self, other, op):","sourceCodeStart":622,"sourceCodeEnd":658,"githubUrl":"https://github.com/pandas-dev/pandas/blob/3b7651241d4da534b3559b60ef128e1c34f54116/pandas/core/arrays/string_arrow.py#L622-L658","documentation":"ArrowStringArray._reduce raises TypeError for any reduction not in (count, min, max, sum, argmin, argmax, any, all). PyArrow-backed string arrays support only those operations; numeric reductions like mean/median/std are undefined for strings.","triggerScenarios":"df['str_col'].mean() where dtype is string[pyarrow]; df.median() including a pyarrow string column; calling _reduce('prod') directly.","commonSituations":"A pipeline computes a fixed list of aggregations on every column; converting a column to string[pyarrow] without updating downstream numeric reductions.","solutions":["Filter numeric columns before reducing: df.select_dtypes('number').mean().","Cast the column to numeric with pd.to_numeric(..., errors='coerce') before reducing.","Restrict reductions to count/min/max/sum/any/all on string columns."],"exampleFix":"// before\ns = pd.array(['1','2','3'], dtype='string[pyarrow]')\npd.Series(s).mean()  # TypeError\n// after\npd.to_numeric(pd.Series(s), errors='coerce').mean()","handlingStrategy":"type-guard","validationCode":"def safe_reduce_arrow(s, name):\n    if pd.api.types.is_string_dtype(s) and name not in {'count','min','max','sum','argmin','argmax','any','all'}:\n        raise TypeError(f\"Reduction '{name}' not supported for string[pyarrow]\")\n    return getattr(s, name)()","typeGuard":"def arrow_string_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 numeric reductions.","Cast string-encoded numbers with pd.to_numeric first.","Restrict reductions to the supported set on string[pyarrow] columns."],"tags":["pandas","arrow-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"}