pandas v3.0.4 - Regression and Bug Fixes
pandas v3.0.4 was published on June 28, 2026, as a stable patch release for the pandas 3.0.x line. The main fix to notice is in DataFrame.to_sql() and read_sql_table() with ADBC engines, where table and schema identifiers are now quoted instead of being passed through in a way that could fail on reserved words or spaces and expose a SQL injection risk. For the source release entry, see the pandas v3.0.4 GitHub release.
The full release notes and downloads are on the GitHub release page. The GitHub note also points to the full whatsnew.
SQL identifier quoting in ADBC paths
The most concrete operator fix is for ADBC backed SQL IO. In pandas 3.0.4, DataFrame.to_sql() and read_sql_table() quote table and schema names as SQL identifiers when an ADBC engine is used. Before this patch, names containing spaces or reserved words could fail.
More seriously, the release notes say the old path was vulnerable to SQL injection. If a service writes data frames to databases through ADBC, this is the item to test first. Quiet database naming rules are boring until one table name hits a reserved word in production.
Search and Arrow regressions
String dtype users get a performance regression fix in Series.searchsorted() and Index.searchsorted(). The bad path did a full O(n) scan for missing values, which is exactly the wrong extra work around an operation that should be a binary search. This matters in sorted string arrays because the wasted scan can dominate the call.
Arrow users get a separate regression fix in isin(). Checking for pd.NA with ArrowDtype no longer raises, and that also helps DataFrame.drop() when indexes are backed by ArrowDtype. If a pipeline moved more columns or indexes to Arrow backed types after pandas 3.0, this is a small but useful correction.
Assignment and dtype behavior fixes
Several fixes are about pandas doing nothing or raising in places where users would expect normal dtype behavior. Setting into a DataFrame with MultiIndex columns and a mixed dtype level no longer silently does nothing. DataFrame.iloc() also handles assignments with unordered or duplicated column indexers when the data is referenced by another object.
The release notes call these out as separate fixes, but the practical shape is the same. pandas should either set the data or raise clearly. Silent no ops are the expensive kind, because they turn into downstream data quality work.
Datetime safety under parallel work
The release also fixes a datetime arithmetic crash. Adding or subtracting offsets such as offsets.MonthEnd or offsets.QuarterEnd from datetime data could segfault when another thread was running, including test runs under pytest-xdist.
That is not a feature change. It is a stability fix for code that already looked valid. If parallel tests were flaky around date offsets, this is the fix in the release to check first.
Upgrade notes
pandas 3.0.4 is not marked as a prerelease. It is a stable patch release, and the project recommends that users on 3.0.x upgrade. pandas 3.0 supports Python 3.11 and newer.
The install commands in the GitHub note keep the version inside the 3.0 line:
python -m pip install --upgrade pandas==3.0.*
conda install -c conda-forge pandas=3.0
For teams that package pandas into notebooks, batch jobs, or image builds, this release is mostly about reducing surprise. The SQL IO fix needs real database coverage. The Arrow fix needs tests with missing values and extension dtypes. The datetime crash fix is the one you want in CI if parallel tests were flaky and annoying to reproduce.
Where to get it
- Release page: pandas v3.0.4
- Repository: pandas-dev/pandas
- Tag:
v3.0.4