pandas v3.0.4 - SQL and Arrow Fixes
pandas v3.0.4 was published on June 28, 2026 as a patch release for the 3.0.x line. For data engineers, the main item is a fix for DataFrame.to_sql() and read_sql_table() with ADBC engines, where table and schema names were not quoted as SQL identifiers. The GitHub metadata does not mark this as a prerelease.
The full release notes and downloads are on the GitHub release page. For the detailed pandas change list behind this patch release, see the full whatsnew.
The ADBC fix is the most relevant change for teams that move DataFrame data into analytical stores. In pandas v3.0.4, DataFrame.to_sql() and read_sql_table() now quote table and schema names as SQL identifiers when using an ADBC engine. The old behavior could fail on names that contain spaces or reserved words.
The same bug also created a SQL injection risk according to the pandas notes. That matters in generated load jobs, catalog driven exports, and ingestion services where SQL is assembled from dataset metadata. The fix narrows a class of failures that tend to appear only after a pipeline hits a table with a less tidy name.
This is not a new connector feature. It is a correctness fix in an existing SQL path, which is usually the kind of patch operators want to absorb quickly if they already run pandas 3.0.x.
pandas v3.0.4 also repairs a few Arrow backed paths. isin() no longer raises when checking for pd.NA with ArrowDtype. The same regression affected DataFrame.drop() with ArrowDtype backed indexes, so this patch is relevant for teams that keep nullable columns and indexes backed by Arrow data.
String handling gets a related cleanup. Series.str.__getitem__() no longer raises AttributeError when the underlying array is ArrowExtensionArray. Series.str.match() and Index.str.match() also get a PyArrow backed fix where a leading ^ in an alternation pattern, such as r"^foo|bar", only anchored the first branch.
Those are small fixes, but they sit in common web and ETL code paths. Scraped text, CSV loads, and warehouse extracts often move through nullable string columns before validation or load.
Several fixes target silent or unexpected mutation behavior. Setting into a DataFrame with MultiIndex columns and a mixed dtype level should no longer silently do nothing. DataFrame.iloc() also gets a fix for assignment with unordered or duplicated column indexers when the DataFrame values are referenced by another object.
There is also a Copy on Write fix for eval() with the Python engine. The old behavior could mutate the original DataFrame when columns were reused in the expression. In batch jobs, that kind of state change can be harder to diagnose than an explicit exception, because later transforms see data that no longer matches the earlier stage.
These fixes do not change the model of pandas 3.0. They make the model hold in more cases. That is the right category for a patch release.
The string dtype path gets a performance regression fix in Series.searchsorted() and Index.searchsorted(). The issue was an O(n) NA scan that could dominate the binary search itself. That is worth noting for lookup heavy transforms and sorted index based joins on string data.
The runtime fixes also cover datetime edge cases. pandas v3.0.4 fixes timestamp localization beyond the year 2100 with zoneinfo timezones. It also fixes a segmentation fault when adding or subtracting a non tick DateOffset, such as offsets.MonthEnd or offsets.QuarterEnd, while another thread was running, for example under pytest-xdist.
The release notes state that pandas 3.0 supports Python 3.11 and higher. The PyPI command remains python -m pip install --upgrade pandas==3.0.*, and the conda forge command remains conda install -c conda-forge pandas=3.0. If you are already on the 3.0.x series, the GitHub release page positions this as a patch upgrade rather than a migration release.
- Release page: GitHub release page
- Repo: Project repo
- Tag:
v3.0.4