{"record":{"id":"b9c029651b7a2a59","repo":"pandas-dev/pandas","slug":"invert-is-not-supported-for-string-dtypes","errorCode":null,"errorMessage":"__invert__ is not supported for string dtypes","messagePattern":"__invert__ is not supported for string dtypes","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"pandas/core/arrays/arrow/array.py","lineNumber":1065,"sourceCode":"            # TODO: By using `zero_copy_only` it may be possible to implement this\n            raise ValueError(\n                \"Unable to avoid copy while creating an array as requested.\"\n            )\n        elif copy is None:\n            # `to_numpy(copy=False)` has the meaning of NumPy `copy=None`.\n            copy = False\n\n        return self.to_numpy(dtype=dtype, copy=copy)\n\n    def __invert__(self) -> Self:\n        # This is a bit wise op for integer types\n        if pa.types.is_integer(self._pa_array.type):\n            return self._from_pyarrow_array(pc.bit_wise_not(self._pa_array))\n        elif pa.types.is_string(self._pa_array.type) or pa.types.is_large_string(\n            self._pa_array.type\n        ):\n            # Raise TypeError instead of pa.ArrowNotImplementedError\n            raise TypeError(\"__invert__ is not supported for string dtypes\")\n        else:\n            return self._from_pyarrow_array(pc.invert(self._pa_array))\n\n    def __neg__(self) -> Self:\n        try:\n            return self._from_pyarrow_array(pc.negate_checked(self._pa_array))\n        except pa.ArrowNotImplementedError as err:\n            raise TypeError(\n                f\"unary '-' not supported for dtype '{self.dtype}'\"\n            ) from err\n\n    def __pos__(self) -> Self:\n        return self._from_pyarrow_array(self._pa_array)\n\n    def __abs__(self) -> Self:\n        return self._from_pyarrow_array(pc.abs_checked(self._pa_array))\n\n    # GH 42600: __getstate__/__setstate__ not necessary once","sourceCodeStart":1047,"sourceCodeEnd":1083,"githubUrl":"https://github.com/pandas-dev/pandas/blob/3b7651241d4da534b3559b60ef128e1c34f54116/pandas/core/arrays/arrow/array.py#L1047-L1083","documentation":"Raised by ArrowExtensionArray.__invert__ (the ~ operator) when the underlying pyarrow type is a string or large_string. Bitwise NOT is meaningless on strings, so pandas raises TypeError proactively rather than letting pyarrow raise ArrowNotImplementedError. Integer types use bit_wise_not; other types fall through to pc.invert.","triggerScenarios":"~arr where arr is an ArrowExtensionArray of dtype string[pyarrow] or large_string[pyarrow]; applying the invert operator to a Series/Index backed by pyarrow strings; chained operations like ~s.isin(values) where s is already boolean-string.","commonSituations":"Inverting a boolean mask but the Series dtype drifted to string[pyarrow]; pyarrow string inference (PD_IO_* infer_string) turning object columns into strings; migrating from object dtype where ~ on object sometimes 'worked' by accident.","solutions":["If you intended a boolean negation, build the boolean mask first: ~s.eq(value) or ~s.isna().","Cast to boolean explicitly before inverting: ~s.astype('boolean[pyarrow]').","Avoid the ~ operator on string arrays; use s != value style comparisons.","Check dtype.kind == 'b' before applying ~."],"exampleFix":"# before\ns = pd.Series(['a', 'b'], dtype=\"string[pyarrow]\")\n~s  # raises TypeError\n\n# after\n~s.eq('a')  # boolean mask, safe to invert","handlingStrategy":"type-guard","validationCode":"import pyarrow as pa\n\ndef safe_invert(arr):\n    if pa.types.is_string(arr._pa_array.type) or pa.types.is_large_string(arr._pa_array.type):\n        raise TypeError('cannot invert string array; build a boolean mask first')\n    return ~arr","typeGuard":"import pyarrow as pa\n\ndef supports_invert(arr) -> bool:\n    t = arr._pa_array.type\n    return not (pa.types.is_string(t) or pa.types.is_large_string(t))","tryCatchPattern":"try:\n    result = ~arr\nexcept TypeError as e:\n    if 'string dtypes' in str(e):\n        result = ~arr.astype('boolean[pyarrow]')\n    else:\n        raise","preventionTips":["Apply ~ only to boolean masks; build masks via comparisons first.","Check dtype.kind == 'b' before inverting.","Watch for pyarrow string inference turning columns into string[pyarrow]."],"tags":["operator","string","type-validation","pyarrow","invert"],"backgroundTag":null,"analyzedSha":"3b7651241d4da534b3559b60ef128e1c34f54116","analyzedAt":"2026-08-11T22:10:44.015Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}