{"record":{"id":"c70985c75434c066","repo":"pandas-dev/pandas","slug":"encountered-an-na-value-with-skipna-false","errorCode":null,"errorMessage":"Encountered an NA value with skipna=False","messagePattern":"Encountered an NA value with skipna=False","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"pandas/core/arrays/_mixins.py","lineNumber":220,"sourceCode":"    ) -> npt.NDArray[np.uint64]:\n        from pandas.core.util.hashing import hash_array\n\n        values = self._ndarray\n        return hash_array(\n            values, encoding=encoding, hash_key=hash_key, categorize=categorize\n        )\n\n    def _cast_pointwise_result(self, values: ArrayLike) -> ArrayLike:\n        if not (isinstance(values, np.ndarray) and values.dtype == object):\n            values = construct_1d_object_array_from_listlike(values)  # type: ignore[arg-type]\n        return lib.maybe_convert_objects(values, convert_non_numeric=True)\n\n    # Signature of \"argmin\" incompatible with supertype \"ExtensionArray\"\n    def argmin(self, axis: AxisInt = 0, skipna: bool = True):  # type: ignore[override]\n        # override base class by adding axis keyword\n        validate_bool_kwarg(skipna, \"skipna\")\n        if not skipna and self._hasna:\n            raise ValueError(\"Encountered an NA value with skipna=False\")\n        return nargminmax(self, \"argmin\", axis=axis)\n\n    # Signature of \"argmax\" incompatible with supertype \"ExtensionArray\"\n    def argmax(self, axis: AxisInt = 0, skipna: bool = True):  # type: ignore[override]\n        # override base class by adding axis keyword\n        validate_bool_kwarg(skipna, \"skipna\")\n        if not skipna and self._hasna:\n            raise ValueError(\"Encountered an NA value with skipna=False\")\n        return nargminmax(self, \"argmax\", axis=axis)\n\n    def unique(self) -> Self:\n        new_data = unique(self._ndarray)\n        return self._from_backing_data(new_data)\n\n    def sort(\n        self,\n        *,\n        ascending: bool = True,","sourceCodeStart":202,"sourceCodeEnd":238,"githubUrl":"https://github.com/pandas-dev/pandas/blob/3b7651241d4da534b3559b60ef128e1c34f54116/pandas/core/arrays/_mixins.py#L202-L238","documentation":"`ValueError` from `NDArrayBackedExtensionArray.argmin` when `skipna=False` and the backing ndarray contains NA. pandas refuses to pick a 'minimum' position when an NA is present and the user explicitly opted out of skipping NAs, because the result would be ambiguous. The check uses `self._hasna` (a cheap cache) before dispatching to the cython `nargminmax`.","triggerScenarios":"`Series.argmin(skipna=False)` or `DataFrame.idxmin(skipna=False)` on a nullable-backed (IntegerArray/Float64Array/ArrowExtensionArray/etc.) Series or frame that contains NA, when the underlying array is an `NDArrayBackedExtensionArray`. Also `np.argmin`-style internal calls routed through this method.","commonSituations":"Calling `idxmin`/`argmin` with `skipna=False` on real-world data containing nulls; switching from numpy-backed to nullable or Arrow dtypes where `_hasna` becomes true; assert-style code that expects a deterministic minimum on incomplete data.","solutions":["Pass `skipna=True` (the default) to ignore NA values: `s.argmin(skipna=True)`.","Drop or fill NA before computing: `s.dropna().argmin()` or `s.fillna(...).argmin()`.","If you truly need skipna=False, first assert the data has no NA: `if s.isna().any(): raise ...` so the failure is intentional and explained."],"exampleFix":"// before\npos = s.argmin(skipna=False)   # s has NA -> ValueError\n\n// after\npos = s.argmin(skipna=True)\n# or\npos = s.dropna().argmin()","handlingStrategy":"validation","validationCode":"if not skipna and s.isna().any():\n    raise ValueError('cannot compute argmin(skipna=False) with NA present')\npos = s.argmin(skipna=skipna)","typeGuard":"def safe_for_argmin_no_skipna(s) -> bool:\n    return not s.isna().any()","tryCatchPattern":"try:\n    pos = s.argmin(skipna=False)\nexcept ValueError as e:\n    if 'skipna=False' in str(e):\n        pos = s.dropna().argmin()\n    else:\n        raise","preventionTips":["Default to skipna=True","Drop or fill NA before computing reductions if you need NA-aware code"],"tags":["nan","argmin","reductions","nullable"],"backgroundTag":null,"analyzedSha":"3b7651241d4da534b3559b60ef128e1c34f54116","analyzedAt":"2026-08-11T22:10:44.015Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}