-
-
Notifications
You must be signed in to change notification settings - Fork 19.2k
Description
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