pandas 3.0.6 was published on 17 September 2026. It is a patch in the 3.0.x series, and it is the first pandas release with general support for the upcoming Python 3.15, including binary wheels on PyPI. The same tag repairs regressions in read_csv, Copy-on-Write assignment, categorical string splits, linear interpolation, and timezone conversion on older tzdata builds.
The full release notes and downloads are on the GitHub release page. The itemized fixes are in the 3.0.6 whatsnew. Eleven people contributed patches. The project asks every 3.0.x user to upgrade. Pandas 3.0 still requires Python 3.11 or newer.
Python 3.15 wheels ¶
pandas 3.0.6 is the first build the project calls generally compatible with the upcoming Python 3.15. Wheels are on PyPI for every platform pandas already ships. Images moving to Python 3.15 can take this tag. Support for the 3.0 series starts at Python 3.11.
Pin the exact build when the environment must stay on this patch: pandas==3.0.6. Older 3.0 tags omit a Python 3.15 compatibility claim. A floating pandas==3.0.* spec picks up that support only after the resolver selects 3.0.6 or a later 3.0 patch.
CSV reads, separator sniffing, and a C engine leak ¶
Three read_csv fixes show up in ingest jobs.
A mixed dtype column selected with usecols raised IndexError where pandas should emit DtypeWarning. The warning also named the wrong column or the wrong index. Both are fixed in GH 67375. A caller that treated IndexError from read_csv as a missing column was catching this regression. The same input now warns.
sep=None tells the python engine to sniff the separator. Before this patch it raised TypeError: object of type 'NoneType' has no len(). Sniffing works again on the python engine. engine="c" and engine="pyarrow" cannot sniff the separator. sep=None with either engine raises ValueError again. Before the fix, the same call raised TypeError or silently stored each line as one column (GH 66639). The silent parse is the case to audit. Row counts stay high while the schema collapses to a single field.
engine="c" also leaked memory when a string or category column failed to decode. The example is invalid UTF-8 with encoding="utf-8" and the default encoding_errors="strict". Tracked as GH 67931. A strict decode error should abort the read. On this bug the failed decode leaked memory in the C engine.
Copy on Write writes that were not copies ¶
Full slice assignment into a PyArrow backed array shared memory with the value on the right. The notes give df.loc[:, "col"] = value. Editing value afterward also changed the assigned column, which breaks Copy-on-Write. Tracked as GH 67990. A step that assigns a column and then mutates the source array was writing through into the frame.
.loc and .iloc failed on a second shape. A boolean mask selected columns of a one column DataFrame with an extension dtype. The notes say the regression showed up on string data. The issues are GH 66527 and GH 66255. Retest masked writes into a one column string frame on any 3.0 job that uses that shape.
RangeIndex lacked Copy-on-Write reference tracking. A write through a Series could corrupt the index with no exception. Tracked as GH 67060. Code that keeps a default index and then writes through a series view is the path to test. The batch keeps running on the corrupted index.
String splits, interpolation, and old tzdata ¶
Series.str.split, Series.str.rsplit, Series.str.partition, and Series.str.rpartition on a CategoricalDtype series with expand=False returned stringified lists and tuples (GH 66341). The printed cell still looks like a collection. Type checks and unpacking see a string. Rerun categorical splits that feed an explode or a length check.
Series.interpolate with method="linear" on a pyarrow backed dtype left consecutive missing values and trailing missing values empty. Integer dtypes also truncated the filled numbers. Results now match the masked equivalent, such as Int64 (GH 65345). An interpolate output saved under an earlier 3.0 patch is stale when the series was pyarrow backed and contained runs of missing values.
Timestamp.tz_convert and Timestamp.tz_localize, and the same methods on Index and Series, could return a UTC offset off by a few minutes. Affected timestamps predate standard time in that zone, usually the early 20th century. The error is limited to older tzdata compiled with a toolchain from 2013 through 2018. The notes name Amazon Linux 2, RHEL 8, and RHEL 8 derivatives (GH 67066). On those hosts, a historical tz_localize result can move a row across a join key or a window edge.
The whatsnew also records a plotting regression. DataFrame.plot.bar and DataFrame.plot.barh raised AttributeError for a regularly spaced DatetimeIndex whose freq is unset (GH 66771). Chart code is the only caller.
Where to get it ¶
Install from PyPI with the series spec from the announcement:
python -m pip install --upgrade pandas==3.0.*
Or from conda-forge:
conda install -c conda-forge pandas=3.0
Either spec can move to a later 3.0 patch. This release is pandas==3.0.6. Report problems on the pandas issue tracker.
- Release page: pandas 3.0.6 on GitHub
- Repository: pandas on GitHub
- Tag:
v3.0.6