# What changed in pandas-stubs

> 88 changes in pandas-stubs 2 to 3 from its official release notes, upgrade guides and advisories: 3 breaking, 37 deprecations, 7 new APIs and options. Each one cited. Sources checked 2026-10-29. HTML: https://unstale.sh/pypi/pandas-stubs/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## pandas-stubs 3

### Breaking changes

- The default for allow_duplicates changed from lib.no_default to False. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.reset_index.html)
- query raises ValueError when expr refers to a non-unique column label and still evaluates to a DataFrame, because no row mask is available. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.query.html)
- The new stack implementation is the default as of pandas 3.0; with future_stack=True, dropna and sort have no impact and must remain unspecified. (3.0.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.stack.html)

### Deprecations

- The JSON-reading option is deprecated; parse date columns with to_datetime() after reading. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/user_guide/io.html)
- The inplace keyword is deprecated and will be removed in pandas 4.0. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.drop.html)
- Passing a dict as data is deprecated; use the DataFrame constructor or DataFrame.from_dict() instead. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.from_records.html)
- Deprecates lsuffix in favor of suffixes. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.join.html)
- Deprecates rsuffix in favor of suffixes. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.join.html)
- The `inplace` keyword is deprecated and will be removed in pandas 4.0. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.set_index.html)
- The `verify_integrity` keyword is deprecated; check `result.index.is_unique` directly instead. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.set_index.html)
- The inplace keyword is deprecated and will be removed in pandas 4.0. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.sort_index.html)
- The 'fastparquet' and 'auto' engine options are deprecated; use 'pyarrow' or omit engine to use the default. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_parquet.html)
- The dropna keyword is deprecated in to_hdf(), HDFStore.put(), HDFStore.append(), and HDFStore.append_to_multiple(); drop rows with DataFrame.dropna() before writing. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/user_guide/io.html)
- The inplace keyword is deprecated and will be removed in pandas 4.0. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.reset_index.html)
- The option is deprecated; use DataFrame.dropna() before writing instead. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/user_guide/io.html)
- The JSON-reading option is deprecated; parse date columns with to_datetime() after reading. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/user_guide/io.html)
- The default engine for xlsx/xlsm files will change from openpyxl to calamine in a future version; pass engine explicitly or set the reader option to retain current behavior. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/user_guide/io.html)
- The convert_boolean keyword is deprecated and will be removed in a future version. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.convert_dtypes.html)
- The convert_floating keyword is deprecated and will be removed in a future version. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.convert_dtypes.html)
- The convert_integer keyword is deprecated and will be removed in a future version. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.convert_dtypes.html)
- The convert_string keyword is deprecated and will be removed in a future version. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.convert_dtypes.html)
- The infer_objects keyword is deprecated and will be removed in a future version. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.convert_dtypes.html)
- The inplace keyword is deprecated and will be removed in pandas 4.0; its displayed default changes from False to <no_default>. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.drop_duplicates.html)
- The inplace keyword is deprecated and will be removed in pandas 4.0; its signature default changes from False to <no_default>. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.dropna.html)
- The inplace keyword is deprecated since pandas 3.1.0 and will be removed in pandas 4.0. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.eval.html)
- Selecting labels with `items` will be deprecated; use `DataFrame.select()` when all items are present in the columns, or an intersection with `.loc` otherwise. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.filter.html)
- Selecting labels with `like` will be deprecated; the notes recommend filtering labels with a callable and `str.contains` instead. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.filter.html)
- Selecting labels with `regex` will be deprecated; the notes recommend filtering labels with a callable and `str.contains` instead. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.filter.html)
- Passing a non-dict to from_dict is deprecated; use the DataFrame constructor instead. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.from_dict.html)
- The inplace keyword is deprecated and will be removed in pandas 4.0. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.query.html)
- The inplace keyword is deprecated in 3.1.0 and will be removed in pandas 4.0. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.rename_axis.html)
- The inplace keyword is deprecated and will be removed in pandas 4.0. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.rename.html)
- The inplace keyword is deprecated and will be removed in pandas 4.0; its default is now shown as <no_default>. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.sort_values.html)
- The dropna keyword is deprecated; call DataFrame.dropna() before writing instead. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_hdf.html)
- The engine emits a deprecation warning and will be removed in a future version; use calamine instead. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/user_guide/io.html)
- All float precision modes now use the same converter; float_precision is deprecated and will be removed in a future version. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html), [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_table.html), [docs](http://pandas.pydata.org/pandas-docs/stable/user_guide/io.html)
- The engine emits a deprecation warning and will be removed in a future version; use calamine instead. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/user_guide/io.html)
- The dropna parameter is deprecated since pandas 3.0 and will be removed in a future version. (3.0.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.stack.html)
- The future_stack parameter is deprecated since pandas 3.0 and will be removed in a future version. (3.0.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.stack.html)
- The sort parameter is deprecated since pandas 3.0 and will be removed in a future version. (3.0.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.stack.html)

### New APIs and options

- Accepts a boolean mask, callable, or pandas.col() expression through cond to filter rows or columns; masks align on the index or must match its length. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html)
- Adds a method to select columns by labels or expressions and create computed columns with keyword arguments; it always returns a DataFrame. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.select.html)
- This option caps or disables parallel parsing of sufficiently large local uncompressed files read with the C engine. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html), [docs](http://pandas.pydata.org/pandas-docs/stable/user_guide/io.html)
- Adds `cond` for filtering with a boolean mask, callable, or expression; expressions are supported only with `axis=0`. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.filter.html)
- Adds `na` to determine how missing values in a boolean mask are treated: `False` by default, `True` to keep them, or `"raise"` to raise a `ValueError`. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.filter.html), [docs](http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html)
- Accepts a boolean mask, callable, or pandas.col() expression through cond to filter rows; masks align on the index or must match its length. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html)
- Adds na to control missing values in the mask: they are False by default, can be kept with True, or raise an error with "raise". (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html)

### Performance

- Eligible large local files read with the C engine are split into chunks and parsed in multiple threads automatically; results match a serial read. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/user_guide/io.html)
- The C engine reads sufficiently large files in parallel; the pyarrow engine is multithreaded. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html), [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_table.html)

### Behavior and default changes

- The calamine engine supports Excel formats; it becomes the default for xls and xlsb when the corresponding legacy engine is not installed. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/user_guide/io.html)
- The default for inplace changed from False to <no_default>. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.drop.html)
- The `inplace` parameter's documented default changes from `False` to `<no_default>`. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.set_index.html)
- The inplace default changes from False to <no_default>. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.sort_index.html)
- The freq of a DatetimeIndex or TimedeltaIndex is lost when it is inserted as a column and is not restored by a subsequent DataFrame.set_index(). (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.reset_index.html)
- The default for inplace changed from False to <no_default>. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.reset_index.html)
- The documented default for convert_boolean changes from True to <no_default>. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.convert_dtypes.html)
- The documented default for convert_floating changes from True to <no_default>. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.convert_dtypes.html)
- The documented default for convert_integer changes from True to <no_default>. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.convert_dtypes.html)
- The documented default for convert_string changes from True to <no_default>. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.convert_dtypes.html)
- The documented default for infer_objects changes from True to <no_default>. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.convert_dtypes.html)
- The documented default for inplace changed from False to <no_default>. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.eval.html)
- The inplace parameter default changes from False to <no_default>. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.rename_axis.html)
- The inplace parameter default changed from False to <no_default>. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.rename.html)
- Appending requires an existing object at key to use table format and requires exactly the same columns in the same order; creating a key with append=True defaults format to table. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_hdf.html), [docs](http://pandas.pydata.org/pandas-docs/stable/user_guide/io.html)
- Passing complib without complevel greater than 0 emits a UserWarning and writes the data uncompressed. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_hdf.html)
- The dropna default changed from None to <no_default>. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_hdf.html)
- The delimiter default is now <no_default> instead of None. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_table.html)
- The delimiter default is now <no_default> instead of None. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html)
- With dtype="category", numeric and boolean categories are inferred; values that do not all parse as numeric or boolean retain string categories. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/user_guide/io.html)
- When chunks infer the same literal as different types, the concatenated column has object dtype, comparisons match only rows with the corresponding representation, and a DtypeWarning is emitted. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html), [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_table.html)

### Tooling

- The default axis is the index for boolean masks and the info axis (`columns` for a DataFrame) when selecting labels; expressions support only the index. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.filter.html)

### Fixes and other changes

- Labels read from a header row are always strings; use names with header=0 to supply labels of another type. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_table.html)
- A DatetimeIndex or TimedeltaIndex created from a column has `freq=None`; passing the index directly as `keys` keeps its `freq`. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.set_index.html)
- Sorting is deterministic for a given input; mergesort and stable preserve equal-key order, and kind is ignored for MultiIndex sorting or when a level is specified. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.sort_index.html)
- The path can be a URL using schemes such as http, ftp, s3, gs, and file; some schemes require additional packages such as s3fs for S3. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_parquet.html)
- Specifying dtype does not change missing-value parsing; recognized missing values remain NaN or the dtype's NA value. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_table.html)
- A file-like object's read method must accept an optional size argument. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_table.html)
- The documentation clarifies accepted header values, indexing, and how names interacts with header inference and overriding. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_table.html)
- Files written by to_hdf use a pandas-specific layout and are intended for pandas read_hdf() or HDFStore, not as a general-purpose interchange format for arbitrary HDF5 consumers. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_hdf.html)
- Duplicate index values are not considered when dropping duplicate rows; use Index.duplicated() with boolean indexing to drop rows with duplicate index labels. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.drop_duplicates.html)
- The positional argument is a mask when it is a callable or expression; other list-like values select labels. A positional list of booleans selects labels and emits a warning. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.filter.html)
- The documentation states that sorting is deterministic for a given input and that mergesort and stable preserve the relative order of equal keys. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.sort_values.html)
- nan_rep is a string used only for missing values in string columns with table format; its default avoids collisions, while a supplied value is interpreted as missing and later appends reuse the table's stored representation. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_hdf.html)
- The documentation lists quoting values 0 through 3 and explains their corresponding csv constants. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_table.html)
- Converters receive raw text, including empty fields as empty strings; missing-value settings are applied to the returned value. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html), [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_table.html)
- S3 URLs require the s3fs library. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html)
- Some URL schemes may require additional packages; for example, S3 URLs require s3fs. (3.1.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_table.html)

## pandas-stubs 2

### Behavior and default changes

- Copy-on-Write is the default with pandas 3.0; it prevents one statement from updating multiple objects and can improve average performance and memory usage by delaying copies. (2.0.0) — [docs](http://pandas.pydata.org/pandas-docs/stable/user_guide/migration.html)
