{"record":{"id":"3d90f33530216e97","repo":"pandas-dev/pandas","slug":"encountered-an-na-value-with-skipna-false-3d90f3","errorCode":null,"errorMessage":"Encountered an NA value with skipna=False","messagePattern":"Encountered an NA value with skipna=False","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"pandas/core/arrays/base.py","lineNumber":1152,"sourceCode":"        int\n\n        See Also\n        --------\n        ExtensionArray.argmax : Return the index of the maximum value.\n\n        Examples\n        --------\n        >>> arr = pd.array([3, 1, 2, 5, 4])\n        >>> arr.argmin()\n        np.int64(1)\n        \"\"\"\n        # Implementer note: You have two places to override the behavior of\n        # argmin.\n        # 1. _values_for_argsort : construct the values used in nargminmax\n        # 2. argmin itself : total control over sorting.\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 cast(\"int\", nargminmax(self, \"argmin\"))\n\n    def argmax(self, skipna: bool = True) -> int:\n        \"\"\"\n        Return the index of maximum value.\n\n        In case of multiple occurrences of the maximum value, the index\n        corresponding to the first occurrence is returned.\n\n        Parameters\n        ----------\n        skipna : bool, default True\n\n        Returns\n        -------\n        int\n\n        See Also","sourceCodeStart":1134,"sourceCodeEnd":1170,"githubUrl":"https://github.com/pandas-dev/pandas/blob/71959b8cb9b2459c16e14b34f28b178ccfe14735/pandas/core/arrays/base.py#L1134-L1170","documentation":"Raised by ExtensionArray.argmin (and the analogous argmax) when `skipna=False` and the array contains any NA/missing value. With skipna=False, pandas refuses to silently return a meaningless index in the presence of NAs, so it raises ValueError. This is the base implementation used by all ExtensionArray subclasses that do not override argmin/argmax.","triggerScenarios":"Calling `s.argmin(skipna=False)` / `s.argmax(skipna=False)` / `s.idxmin(skipna=False)` / `s.idxmax(skipna=False)` on a nullable extension array (Int64, Float64, string[pyarrow], etc.) that has any NA values.","commonSituations":"Nullable numeric columns in ETL where NA means 'unknown'; analytics dashboards computing argmin/argmax with explicit NA semantics; custom reduction pipelines that pass skipna through from user config.","solutions":["Use the default skipna=True to skip NAs: `s.argmin()`.","Drop NA before computing: `s.dropna().argmin()` (note: index shifts).","Pre-check for NA and decide: `if s.isna().any(): ... else: s.argmin(skipna=False)`.","Fill NA with a sentinel that preserves intended ordering, then call argmin(skipna=False)."],"exampleFix":"# before\ns = pd.Series([3, None, 1], dtype=\"Int64\")\ns.argmin(skipna=False)  # ValueError: Encountered an NA value with skipna=False\n\n# after\ns.argmin()                # skipna=True (default)\n# or\nif not s.isna().any():\n    s.argmin(skipna=False)","handlingStrategy":"validation","validationCode":"def safe_argmin(s, skipna=False):\n    if not skipna and s.isna().any():\n        raise ValueError(\"Array contains NA; pass skipna=True or dropna first\")\n    return s.argmin(skipna=skipna)","typeGuard":"def has_no_na(s) -> bool:\n    return not bool(s.isna().any())","tryCatchPattern":"try:\n    return s.argmin(skipna=False)\nexcept ValueError as e:\n    if \"NA value with skipna=False\" in str(e):\n        return s.dropna().argmin()\n    raise","preventionTips":["Default to skipna=True for nullable columns.","Pre-check s.isna().any() before skipna=False reductions.","Document NA semantics in reduction utilities so callers know to pass skipna explicitly."],"tags":["extension-array","missing-data","reduction","validation"],"analyzedSha":"71959b8cb9b2459c16e14b34f28b178ccfe14735","analyzedAt":"2026-08-07T01:30:20.476Z","schemaVersion":2},"datasetVersion":"2026-08-07T03:17:09.362Z"}