{"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/71959b8cb9b2459c16e14b34f28b178ccfe14735/pandas/core/arrays/string_.py#L960-L996","documentation":"StringArray._reduce supports only a fixed set of reductions: any, all, count, min, max, argmin, argmax, sum. Any other reduction name (mean, median, std, var, prod, sem, skew) raises TypeError because those operations are not defined for string data.","triggerScenarios":"Calling string_series.mean(), string_series.median(), string_series.std(), string_series.prod(), string_series.sem(), or any numeric-only reduction on a string-typed Series/array.","commonSituations":"Generic describe()/agg() pipelines that apply numeric reductions to every column; statistical code run over a DataFrame that includes string columns.","solutions":["Select only numeric columns before applying numeric reductions (e.g., df.select_dtypes('number')).","If the strings encode numbers, convert first: s.astype(float).mean().","Use the supported reductions (count, min, max, sum, any, all) for string data."],"exampleFix":"// before\nstring_series.mean()\n\n// after\nstring_series.astype(float).mean()","handlingStrategy":"validation","validationCode":"SUPPORTED = {'any', 'all', 'count', 'min', 'max', 'argmin', 'argmax', 'sum'}\nif name not in SUPPORTED:\n    raise TypeError(f'Reduction {name} not supported for string dtype')","typeGuard":"SUPPORTED = {'any', 'all', 'count', 'min', 'max', 'argmin', 'argmax', 'sum'}\n\ndef is_supported_string_reduction(name: str) -> bool:\n    return name in SUPPORTED","tryCatchPattern":null,"preventionTips":["Select numeric columns before applying numeric reductions (select_dtypes('number')).","Convert numeric strings via astype(float) before numeric reduction.","Whitelist supported reductions for string columns in generic aggregation code."],"tags":["string-array","reduction","type-error","numeric"],"analyzedSha":"71959b8cb9b2459c16e14b34f28b178ccfe14735","analyzedAt":"2026-08-07T01:30:20.476Z","schemaVersion":2},"datasetVersion":"2026-08-07T03:17:09.362Z"}