Skip to content

BUG: pandera check fails with pandas KeyError on certain columns starting with version 2.3.3 #62711

@melohr

Description

@melohr

Pandas version checks

  • I have checked that this issue has not already been reported.

  • I have confirmed this bug exists on the latest version of pandas.

  • I have confirmed this bug exists on the main branch of pandas.

Reproducible Example

import pandas as pd
import pandera.pandas as pa
import pandera.typing as pt


df = pd.DataFrame({
    'Status': ['Available', 'In_Use'],
    'Completed': ['true', 'false'],
    'UnaffectedData': [0, 3],
})

class PanderaTest(pa.DataFrameModel):
    Status: pt.Series[str] = pa.Field(
        isin=[
            "Available",
            "In_Use",
            "Reserved",
            "Intended_For_Deactivation",
            "Expired",
        ],
        nullable=False,
    )
    Completed: pt.Series[str] = pa.Field(
        isin=["True", "true", "False", "false", "TRUE", "FALSE"], nullable=False
    )
    UnaffectedData: pt.Series[int] = pa.Field(nullable=False)

PanderaTest.validate(df)

Traceback

c:; cd 'c:\Users\<UID>\GitHub\<repo>'; & 'c:\Users\<UID>\AppData\Local\miniconda3\envs\pandas_fail\python.exe' 'c:\Users\<UID>\.vscode\extensions\ms-python.debugpy-2025.14.1-win32-x64\bundled\libs\debugpy\launcher' '53595' '--' 'C:\Users\<UID>\GitHub\<repo>\.vscode\pandas-reprex.py' 
Traceback (most recent call last):
  File "c:\Users\<UID>\AppData\Local\miniconda3\envs\pandas_fail\Lib\runpy.py", line 198, in _run_module_as_main
    return _run_code(code, main_globals, None,
                     "__main__", mod_spec)
  File "c:\Users\<UID>\AppData\Local\miniconda3\envs\pandas_fail\Lib\runpy.py", line 88, in _run_code
    exec(code, run_globals)
    ~~~~^^^^^^^^^^^^^^^^^^^
  File "c:\Users\<UID>\.vscode\extensions\ms-python.debugpy-2025.14.1-win32-x64\bundled\libs\debugpy\launcher/../..\debugpy\__main__.py", line 71, in <module>
    cli.main()
    ~~~~~~~~^^
  File "c:\Users\<UID>\.vscode\extensions\ms-python.debugpy-2025.14.1-win32-x64\bundled\libs\debugpy\launcher/../..\debugpy/..\debugpy\server\cli.py", line 508, in main
    run()
    ~~~^^
  File "c:\Users\<UID>\.vscode\extensions\ms-python.debugpy-2025.14.1-win32-x64\bundled\libs\debugpy\launcher/../..\debugpy/..\debugpy\server\cli.py", line 358, in run_file
    runpy.run_path(target, run_name="__main__")
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "c:\Users\<UID>\.vscode\extensions\ms-python.debugpy-2025.14.1-win32-x64\bundled\libs\debugpy\_vendored\pydevd\_pydevd_bundle\pydevd_runpy.py", line 310, in run_path
    return _run_module_code(code, init_globals, run_name, pkg_name=pkg_name, script_name=fname)
  File "c:\Users\<UID>\.vscode\extensions\ms-python.debugpy-2025.14.1-win32-x64\bundled\libs\debugpy\_vendored\pydevd\_pydevd_bundle\pydevd_runpy.py", line 127, in _run_module_code
    _run_code(code, mod_globals, init_globals, mod_name, mod_spec, pkg_name, script_name)
    ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "c:\Users\<UID>\.vscode\extensions\ms-python.debugpy-2025.14.1-win32-x64\bundled\libs\debugpy\_vendored\pydevd\_pydevd_bundle\pydevd_runpy.py", line 118, in _run_code
    exec(code, run_globals)
    ~~~~^^^^^^^^^^^^^^^^^^^
  File "C:\Users\<UID>\GitHub\<repo>\.vscode\pandera-reprex.py", line 28, in <module>
    PanderaTest.validate(df)
    ~~~~~~~~~~~~~~~~~~~~^^^^
  File "c:\Users\<UID>\AppData\Local\miniconda3\envs\pandas_fail\Lib\site-packages\pandera\api\pandas\model.py", line 192, in validate
    cls.to_schema().validate(
    ~~~~~~~~~~~~~~~~~~~~~~~~^
        check_obj, head, tail, sample, random_state, lazy, inplace
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ),
    ^
  File "c:\Users\<UID>\AppData\Local\miniconda3\envs\pandas_fail\Lib\site-packages\pandera\api\pandas\container.py", line 117, in validate
    return self._validate(
           ~~~~~~~~~~~~~~^
        check_obj=check_obj,
        ^^^^^^^^^^^^^^^^^^^^
    ...<5 lines>...
        inplace=inplace,
        ^^^^^^^^^^^^^^^^
    )
    ^
  File "c:\Users\<UID>\AppData\Local\miniconda3\envs\pandas_fail\Lib\site-packages\pandera\api\pandas\container.py", line 138, in _validate
    return self.get_backend(check_obj).validate(
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        check_obj,
        ^^^^^^^^^^
    ...<6 lines>...
        inplace=inplace,
        ^^^^^^^^^^^^^^^^
    )
    ^
  File "c:\Users\<UID>\AppData\Local\miniconda3\envs\pandas_fail\Lib\site-packages\pandera\backends\pandas\container.py", line 104, in validate
    error_handler = self.run_checks_and_handle_errors(
        error_handler,
    ...<8 lines>...
        random_state,
    )
  File "c:\Users\<UID>\AppData\Local\miniconda3\envs\pandas_fail\Lib\site-packages\pandera\backends\pandas\container.py", line 191, in run_checks_and_handle_errors
    error_handler.collect_error(
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        validation_type(result.reason_code),
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ...<2 lines>...
        result.original_exc,
        ^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "c:\Users\<UID>\AppData\Local\miniconda3\envs\pandas_fail\Lib\site-packages\pandera\api\base\error_handler.py", line 54, in collect_error
    raise schema_error from original_exc
  File "c:\Users\<UID>\AppData\Local\miniconda3\envs\pandas_fail\Lib\site-packages\pandera\backends\pandas\container.py", line 226, in run_schema_component_checks
    result = schema_component.validate(
        check_obj, lazy=lazy, inplace=True
    )
  File "c:\Users\<UID>\AppData\Local\miniconda3\envs\pandas_fail\Lib\site-packages\pandera\api\dataframe\components.py", line 148, in validate
    return self.get_backend(check_obj).validate(
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        check_obj,
        ^^^^^^^^^^
    ...<6 lines>...
        inplace=inplace,
        ^^^^^^^^^^^^^^^^
    )
    ^
  File "c:\Users\<UID>\AppData\Local\miniconda3\envs\pandas_fail\Lib\site-packages\pandera\backends\pandas\components.py", line 141, in validate
    validated_column = validate_column(
        check_obj,
        column_name,
        return_check_obj=True,
    )
  File "c:\Users\<UID>\AppData\Local\miniconda3\envs\pandas_fail\Lib\site-packages\pandera\backends\pandas\components.py", line 101, in validate_column
    error_handler.collect_error(
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        validation_type(err.reason_code), err.reason_code, err
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "c:\Users\<UID>\AppData\Local\miniconda3\envs\pandas_fail\Lib\site-packages\pandera\api\base\error_handler.py", line 54, in collect_error
    raise schema_error from original_exc
  File "c:\Users\<UID>\AppData\Local\miniconda3\envs\pandas_fail\Lib\site-packages\pandera\backends\pandas\components.py", line 77, in validate_column
    validated_check_obj = super(ColumnBackend, self).validate(
        check_obj,
    ...<6 lines>...
        inplace=inplace,
    )
  File "c:\Users\<UID>\AppData\Local\miniconda3\envs\pandas_fail\Lib\site-packages\pandera\backends\pandas\array.py", line 74, in validate
    error_handler = self.run_checks_and_handle_errors(
        error_handler,
    ...<5 lines>...
        random_state=random_state,
    )
  File "c:\Users\<UID>\AppData\Local\miniconda3\envs\pandas_fail\Lib\site-packages\pandera\backends\pandas\array.py", line 138, in run_checks_and_handle_errors
    error_handler.collect_error(
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        validation_type(result.reason_code),
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ...<2 lines>...
        original_exc=result.original_exc,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "c:\Users\<UID>\AppData\Local\miniconda3\envs\pandas_fail\Lib\site-packages\pandera\api\base\error_handler.py", line 54, in collect_error
    raise schema_error from original_exc
pandera.errors.SchemaError: Error while executing check function: KeyError("<class 'pandas.core.series.Series'>")
Traceback (most recent call last):
  File "c:\Users\<UID>\AppData\Local\miniconda3\envs\pandas_fail\Lib\site-packages\pandera\backends\pandas\components.py", line 240, in run_checks
    self.run_check(
    ~~~~~~~~~~~~~~^
        check_obj, schema, check, check_index, *check_args
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "c:\Users\<UID>\AppData\Local\miniconda3\envs\pandas_fail\Lib\site-packages\pandera\backends\pandas\base.py", line 115, in run_check
    check_result: CheckResult = check(check_obj, *args)
                                ~~~~~^^^^^^^^^^^^^^^^^^
  File "c:\Users\<UID>\AppData\Local\miniconda3\envs\pandas_fail\Lib\site-packages\pandera\api\checks.py", line 230, in __call__
    return backend(check_obj, column)
  File "c:\Users\<UID>\AppData\Local\miniconda3\envs\pandas_fail\Lib\site-packages\pandera\backends\pandas\checks.py", line 349, in __call__
    check_output = self.apply(check_obj)
  File "c:\Users\<UID>\AppData\Local\miniconda3\envs\pandas_fail\Lib\site-packages\pandera\backends\pandas\checks.py", line 148, in apply
    return apply_fn(check_obj)
  File "c:\Users\<UID>\AppData\Local\miniconda3\envs\pandas_fail\Lib\site-packages\pandera\backends\pandas\checks.py", line 156, in apply_field
    return self.check_fn(check_obj)
           ~~~~~~~~~~~~~^^^^^^^^^^^
  File "c:\Users\<UID>\AppData\Local\miniconda3\envs\pandas_fail\Lib\site-packages\pandera\api\function_dispatch.py", line 24, in __call__
    fn = self._function_registry[input_data_type]
         ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
KeyError: <class 'pandas.core.series.Series'>

Issue Description

I use pandera to check my pandas dataframe. Up to pandas version 2.3.2, checks passed as intended. Starting with version 2.3.3, I start encountering KeyError: <class 'pandas.core.series.Series'>.

I work with anaconda. The two venv reprex are:

conda create -y --name pandas_pass python==3.13.9 pandas==2.3.2 pandera
conda create -y --name pandas_fail python==3.13.9 pandas==2.3.3 pandera

The pandera version installed in the venv is the current 0.26.1, but I also tested 0.26.0, 0.25.0, and 0.24.0 and all work just fine with pandas <= 2.3.2.

Expected Behavior

The pandera check is expected to pass (not throwing an exception) with correct data.

Installed Versions

pytest : None
python-calamine : None
pyxlsb : None
s3fs : None
scipy : None
sqlalchemy : None
tables : None
tabulate : None
xarray : None
xlrd : None
xlsxwriter : None
zstandard : None
tzdata : 2025.2
qtpy : None
pyqt5 : None

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions