pandas-dev/pandas · error · ValueError

Encountered an NA value with skipna=False

Error message

Encountered an NA value with skipna=False

What it means

Raised by NDArrayBackedExtensionArray.argmin when skipna=False and the array contains NA values. The index of the minimum is undefined in the presence of NA, so pandas refuses instead of returning a potentially misleading position. This path backs Series.argmin / DataFrame.idxmin for nullable and extension dtypes (Categorical, Period, DatetimeTZ, etc.).

Source

Thrown at pandas/core/arrays/_mixins.py:220

    ) -> npt.NDArray[np.uint64]:
        from pandas.core.util.hashing import hash_array

        values = self._ndarray
        return hash_array(
            values, encoding=encoding, hash_key=hash_key, categorize=categorize
        )

    def _cast_pointwise_result(self, values: ArrayLike) -> ArrayLike:
        if not (isinstance(values, np.ndarray) and values.dtype == object):
            values = construct_1d_object_array_from_listlike(values)  # type: ignore[arg-type]
        return lib.maybe_convert_objects(values, convert_non_numeric=True)

    # Signature of "argmin" incompatible with supertype "ExtensionArray"
    def argmin(self, axis: AxisInt = 0, skipna: bool = True):  # type: ignore[override]
        # override base class by adding axis keyword
        validate_bool_kwarg(skipna, "skipna")
        if not skipna and self._hasna:
            raise ValueError("Encountered an NA value with skipna=False")
        return nargminmax(self, "argmin", axis=axis)

    # Signature of "argmax" incompatible with supertype "ExtensionArray"
    def argmax(self, axis: AxisInt = 0, skipna: bool = True):  # type: ignore[override]
        # override base class by adding axis keyword
        validate_bool_kwarg(skipna, "skipna")
        if not skipna and self._hasna:
            raise ValueError("Encountered an NA value with skipna=False")
        return nargminmax(self, "argmax", axis=axis)

    def unique(self) -> Self:
        new_data = unique(self._ndarray)
        return self._from_backing_data(new_data)

    def sort(
        self,
        *,
        ascending: bool = True,

View on GitHub (pinned to 71959b8cb9)

Solutions

  1. Pass skipna=True (the default) to skip nulls.
  2. Drop or fill NAs first: s.dropna().argmin().
  3. If you need to detect NA, check s.isna().any() separately instead of relying on skipna=False to surface it.

Example fix

// before
s.argmin(skipna=False)
// after
s.dropna().argmin()
Defensive patterns

Strategy: validation

Validate before calling

def safe_argmin(s, skipna=True):
    if not skipna and s.isna().any():
        raise ValueError("NA present; pass skipna=True or dropna() first")
    return s.argmin(skipna=skipna)

Prevention

When it happens

Trigger: s.argmin(skipna=False) or df.idxmin(skipna=False) on a nullable/extension-dtype Series or column that contains nulls (NaN, NaT, pd.NA).

Common situations: Running idxmin/argmin on uncleaned data; using skipna=False intending to detect NA presence.

Related errors


AI-assisted analysis of pandas-dev/pandas@71959b8cb9 (2026-08-07). Data as JSON: /api/errors/c70985c75434c066. Report an issue: GitHub.