These are the changes in pandas 1.5.0. See :ref:`release` for a full changelog including other versions of pandas.
{{ header }}
Pandas now implement the DataFrame exchange API spec. See the full details on the API at https://data-apis.org/dataframe-protocol/latest/index.html
The protocol consists of two parts:
- New method :meth:`DataFrame.__dataframe__` which produces the exchange object. It effectively "exports" the Pandas dataframe as an exchange object so any other library which has the protocol implemented can "import" that dataframe without knowing anything about the producer except that it makes an exchange object.
- New function :func:`pandas.api.exchange.from_dataframe` which can take an arbitrary exchange object from any conformant library and construct a Pandas DataFrame out of it.
The most notable development is the new method :meth:`.Styler.concat` which allows adding customised footer rows to visualise additional calculations on the data, e.g. totals and counts etc. (:issue:`43875`, :issue:`46186`)
Additionally there is an alternative output method :meth:`.Styler.to_string`, which allows using the Styler's formatting methods to create, for example, CSVs (:issue:`44502`).
Minor feature improvements are:
- Adding the ability to render
borderandborder-{side}CSS properties in Excel (:issue:`42276`)- Making keyword arguments consist: :meth:`.Styler.highlight_null` now accepts
colorand deprecatesnull_coloralthough this remains backwards compatible (:issue:`45907`)
Control of index with group_keys in :meth:`DataFrame.resample`
The argument group_keys has been added to the method :meth:`DataFrame.resample`.
As with :meth:`DataFrame.groupby`, this argument controls the whether each group is added
to the index in the resample when :meth:`.Resampler.apply` is used.
Warning
Not specifying the group_keys argument will retain the
previous behavior and emit a warning if the result will change
by specifying group_keys=False. In a future version
of pandas, not specifying group_keys will default to
the same behavior as group_keys=False.
.. ipython:: python
df = pd.DataFrame(
{'a': range(6)},
index=pd.date_range("2021-01-01", periods=6, freq="8H")
)
df.resample("D", group_keys=True).apply(lambda x: x)
df.resample("D", group_keys=False).apply(lambda x: x)
Previously, the resulting index would depend upon the values returned by apply,
as seen in the following example.
In [1]: # pandas 1.3
In [2]: df.resample("D").apply(lambda x: x)
Out[2]:
a
2021-01-01 00:00:00 0
2021-01-01 08:00:00 1
2021-01-01 16:00:00 2
2021-01-02 00:00:00 3
2021-01-02 08:00:00 4
2021-01-02 16:00:00 5
In [3]: df.resample("D").apply(lambda x: x.reset_index())
Out[3]:
index a
2021-01-01 0 2021-01-01 00:00:00 0
1 2021-01-01 08:00:00 1
2 2021-01-01 16:00:00 2
2021-01-02 0 2021-01-02 00:00:00 3
1 2021-01-02 08:00:00 4
2 2021-01-02 16:00:00 5
Added new function :func:`~pandas.from_dummies` to convert a dummy coded :class:`DataFrame` into a categorical :class:`DataFrame`.
Example:
.. ipython:: python
import pandas as pd
- df = pd.DataFrame({"col1_a": [1, 0, 1], "col1_b": [0, 1, 0],
- "col2_a": [0, 1, 0], "col2_b": [1, 0, 0], "col2_c": [0, 0, 1]})
pd.from_dummies(df, sep="_")
The new method :meth:`DataFrame.to_orc` allows writing to ORC files (:issue:`43864`).
This functionality depends the pyarrow library. For more details, see :ref:`the IO docs on ORC <io.orc>`.
Warning
- It is highly recommended to install pyarrow using conda due to some issues occurred by pyarrow.
- :func:`~pandas.DataFrame.to_orc` requires pyarrow>=7.0.0.
- :func:`~pandas.DataFrame.to_orc` is not supported on Windows yet, you can find valid environments on :ref:`install optional dependencies <install.warn_orc>`.
- For supported dtypes please refer to supported ORC features in Arrow.
- Currently timezones in datetime columns are not preserved when a dataframe is converted into ORC files.
df = pd.DataFrame(data={"col1": [1, 2], "col2": [3, 4]})
df.to_orc("./out.orc")I/O methods like :func:`read_csv` or :meth:`DataFrame.to_json` now allow reading and writing directly on TAR archives (:issue:`44787`).
df = pd.read_csv("./movement.tar.gz")
# ...
df.to_csv("./out.tar.gz")This supports .tar, .tar.gz, .tar.bz and .tar.xz2 archives.
The used compression method is inferred from the filename.
If the compression method cannot be inferred, use the compression argument:
df = pd.read_csv(some_file_obj, compression={"method": "tar", "mode": "r:gz"}) # noqa F821(mode being one of tarfile.open's modes: https://docs.python.org/3/library/tarfile.html#tarfile.open)
Similar to other IO methods, :func:`pandas.read_xml` now supports assigning specific dtypes to columns, apply converter methods, and parse dates (:issue:`43567`).
.. ipython:: python
xml_dates = """<?xml version='1.0' encoding='utf-8'?>
<data>
<row>
<shape>square</shape>
<degrees>00360</degrees>
<sides>4.0</sides>
<date>2020-01-01</date>
</row>
<row>
<shape>circle</shape>
<degrees>00360</degrees>
<sides/>
<date>2021-01-01</date>
</row>
<row>
<shape>triangle</shape>
<degrees>00180</degrees>
<sides>3.0</sides>
<date>2022-01-01</date>
</row>
</data>"""
df = pd.read_xml(
xml_dates,
dtype={'sides': 'Int64'},
converters={'degrees': str},
parse_dates=['date']
)
df
df.dtypes
For very large XML files that can range in hundreds of megabytes to gigabytes, :func:`pandas.read_xml` now supports parsing such sizeable files using lxml's iterparse and etree's iterparse which are memory-efficient methods to iterate through XML trees and extract specific elements and attributes without holding entire tree in memory (:issue:`45442`).
In [1]: df = pd.read_xml(
... "/path/to/downloaded/enwikisource-latest-pages-articles.xml",
... iterparse = {"page": ["title", "ns", "id"]})
... )
df
Out[2]:
title ns id
0 Gettysburg Address 0 21450
1 Main Page 0 42950
2 Declaration by United Nations 0 8435
3 Constitution of the United States of America 0 8435
4 Declaration of Independence (Israel) 0 17858
... ... ... ...
3578760 Page:Black cat 1897 07 v2 n10.pdf/17 104 219649
3578761 Page:Black cat 1897 07 v2 n10.pdf/43 104 219649
3578762 Page:Black cat 1897 07 v2 n10.pdf/44 104 219649
3578763 The History of Tom Jones, a Foundling/Book IX 0 12084291
3578764 Page:Shakespeare of Stratford (1926) Yale.djvu/91 104 21450
[3578765 rows x 3 columns]
- :meth:`Series.map` now raises when
argis dict butna_actionis not eitherNoneor'ignore'(:issue:`46588`) - :meth:`MultiIndex.to_frame` now supports the argument
allow_duplicatesand raises on duplicate labels if it is missing or False (:issue:`45245`) - :class:`.StringArray` now accepts array-likes containing nan-likes (
None,np.nan) for thevaluesparameter in its constructor in addition to strings and :attr:`pandas.NA`. (:issue:`40839`) - Improved the rendering of
categoriesin :class:`CategoricalIndex` (:issue:`45218`) - :meth:`DataFrame.plot` will now allow the
subplotsparameter to be a list of iterables specifying column groups, so that columns may be grouped together in the same subplot (:issue:`29688`). - :meth:`to_numeric` now preserves float64 arrays when downcasting would generate values not representable in float32 (:issue:`43693`)
- :meth:`Series.reset_index` and :meth:`DataFrame.reset_index` now support the argument
allow_duplicates(:issue:`44410`) - :meth:`.GroupBy.min` and :meth:`.GroupBy.max` now supports Numba execution with the
enginekeyword (:issue:`45428`) - :func:`read_csv` now supports
defaultdictas adtypeparameter (:issue:`41574`) - :meth:`DataFrame.rolling` and :meth:`Series.rolling` now support a
stepparameter with fixed-length windows (:issue:`15354`) - Implemented a
bool-dtype :class:`Index`, passing a bool-dtype array-like topd.Indexwill now retainbooldtype instead of casting toobject(:issue:`45061`) - Implemented a complex-dtype :class:`Index`, passing a complex-dtype array-like to
pd.Indexwill now retain complex dtype instead of casting toobject(:issue:`45845`) - :class:`Series` and :class:`DataFrame` with
IntegerDtypenow supports bitwise operations (:issue:`34463`) - Add
millisecondsfield support for :class:`.DateOffset` (:issue:`43371`) - :meth:`DataFrame.reset_index` now accepts a
namesargument which renames the index names (:issue:`6878`) - :func:`concat` now raises when
levelsis given butkeysis None (:issue:`46653`) - :func:`concat` now raises when
levelscontains duplicate values (:issue:`46653`) - Added
numeric_onlyargument to :meth:`DataFrame.corr`, :meth:`DataFrame.corrwith`, :meth:`DataFrame.cov`, :meth:`DataFrame.idxmin`, :meth:`DataFrame.idxmax`, :meth:`.DataFrameGroupBy.idxmin`, :meth:`.DataFrameGroupBy.idxmax`, :meth:`.GroupBy.var`, :meth:`.GroupBy.std`, :meth:`.GroupBy.sem`, and :meth:`.DataFrameGroupBy.quantile` (:issue:`46560`) - A :class:`errors.PerformanceWarning` is now thrown when using
string[pyarrow]dtype with methods that don't dispatch topyarrow.computemethods (:issue:`42613`, :issue:`46725`) - Added
validateargument to :meth:`DataFrame.join` (:issue:`46622`) - A :class:`errors.PerformanceWarning` is now thrown when using
string[pyarrow]dtype with methods that don't dispatch topyarrow.computemethods (:issue:`42613`) - Added
numeric_onlyargument to :meth:`Resampler.sum`, :meth:`Resampler.prod`, :meth:`Resampler.min`, :meth:`Resampler.max`, :meth:`Resampler.first`, and :meth:`Resampler.last` (:issue:`46442`) timesargument in :class:`.ExponentialMovingWindow` now acceptsnp.timedelta64(:issue:`47003`)- :class:`.DataError`, :class:`.SpecificationError`, :class:`.SettingWithCopyError`, :class:`.SettingWithCopyWarning`, :class:`.NumExprClobberingError`, :class:`.UndefinedVariableError`, and :class:`.IndexingError` are now exposed in
pandas.errors(:issue:`27656`) - Added
check_likeargument to :func:`testing.assert_series_equal` (:issue:`47247`) - Allow reading compressed SAS files with :func:`read_sas` (e.g.,
.sas7bdat.gzfiles) - :meth:`DatetimeIndex.astype` now supports casting timezone-naive indexes to
datetime64[s],datetime64[ms], anddatetime64[us], and timezone-aware indexes to the correspondingdatetime64[unit, tzname]dtypes (:issue:`47579`) - :class:`Series` reducers (e.g.
min,max,sum,mean) will now successfully operate when the dtype is numeric andnumeric_only=Trueis provided; previously this would raise aNotImplementedError(:issue:`47500`) - :meth:`DataFrame.compare` now accepts a
suffixesto allow the user to specify the suffixes of both left and right DataFrame which are being compared. This is by default'self'and'other'(:issue:`44354`)
These are bug fixes that might have notable behavior changes.
A transform is an operation whose result has the same size as its input. When the
result is a :class:`DataFrame` or :class:`Series`, it is also required that the
index of the result matches that of the input. In pandas 1.4, using
:meth:`.DataFrameGroupBy.transform` or :meth:`.SeriesGroupBy.transform` with null
values in the groups and dropna=True gave incorrect results. Demonstrated by the
examples below, the incorrect results either contained incorrect values, or the result
did not have the same index as the input.
.. ipython:: python
df = pd.DataFrame({'a': [1, 1, np.nan], 'b': [2, 3, 4]})
Old behavior:
In [3]: # Value in the last row should be np.nan
df.groupby('a', dropna=True).transform('sum')
Out[3]:
b
0 5
1 5
2 5
In [3]: # Should have one additional row with the value np.nan
df.groupby('a', dropna=True).transform(lambda x: x.sum())
Out[3]:
b
0 5
1 5
In [3]: # The value in the last row is np.nan interpreted as an integer
df.groupby('a', dropna=True).transform('ffill')
Out[3]:
b
0 2
1 3
2 -9223372036854775808
In [3]: # Should have one additional row with the value np.nan
df.groupby('a', dropna=True).transform(lambda x: x)
Out[3]:
b
0 2
1 3
New behavior:
.. ipython:: python
df.groupby('a', dropna=True).transform('sum')
df.groupby('a', dropna=True).transform(lambda x: x.sum())
df.groupby('a', dropna=True).transform('ffill')
df.groupby('a', dropna=True).transform(lambda x: x)
:meth:`DataFrame.to_json`, :meth:`Series.to_json`, and :meth:`Index.to_json` would incorrectly localize DatetimeArrays/DatetimeIndexes with tz-naive Timestamps to UTC. (:issue:`38760`)
Note that this patch does not fix the localization of tz-aware Timestamps to UTC upon serialization. (Related issue :issue:`12997`)
Old Behavior
.. ipython:: python
index = pd.date_range(
start='2020-12-28 00:00:00',
end='2020-12-28 02:00:00',
freq='1H',
)
a = pd.Series(
data=range(3),
index=index,
)
In [4]: a.to_json(date_format='iso')
Out[4]: '{"2020-12-28T00:00:00.000Z":0,"2020-12-28T01:00:00.000Z":1,"2020-12-28T02:00:00.000Z":2}'
In [5]: pd.read_json(a.to_json(date_format='iso'), typ="series").index == a.index
Out[5]: array([False, False, False])
New Behavior
.. ipython:: python
a.to_json(date_format='iso')
# Roundtripping now works
pd.read_json(a.to_json(date_format='iso'), typ="series").index == a.index
Some minimum supported versions of dependencies were updated. If installed, we now require:
| Package | Minimum Version | Required | Changed |
|---|---|---|---|
| numpy | 1.19.5 | X | X |
| mypy (dev) | 0.960 | X | |
| beautifulsoup4 | 4.9.3 | X | |
| blosc | 1.21.0 | X | |
| bottleneck | 1.3.2 | X | |
| fsspec | 2021.05.0 | X | |
| hypothesis | 6.13.0 | X | |
| gcsfs | 2021.05.0 | X | |
| jinja2 | 3.0.0 | X | |
| lxml | 4.6.3 | X | |
| numba | 0.53.1 | X | |
| numexpr | 2.7.3 | X | |
| openpyxl | 3.0.7 | X | |
| pandas-gbq | 0.15.0 | X | |
| psycopg2 | 2.8.6 | X | |
| pymysql | 1.0.2 | X | |
| pyreadstat | 1.1.2 | X | |
| pyxlsb | 1.0.8 | X | |
| s3fs | 2021.05.0 | X | |
| scipy | 1.7.1 | X | |
| sqlalchemy | 1.4.16 | X | |
| tabulate | 0.8.9 | X | |
| xarray | 0.19.0 | X | |
| xlsxwriter | 1.4.3 | X |
For optional libraries the general recommendation is to use the latest version. The following table lists the lowest version per library that is currently being tested throughout the development of pandas. Optional libraries below the lowest tested version may still work, but are not considered supported.
| Package | Minimum Version | Changed |
|---|---|---|
| X |
See :ref:`install.dependencies` and :ref:`install.optional_dependencies` for more.
- BigQuery I/O methods :func:`read_gbq` and :meth:`DataFrame.to_gbq` default to
auth_local_webserver = True. Google has deprecated theauth_local_webserver = False"out of band" (copy-paste) flow. Theauth_local_webserver = Falseoption is planned to stop working in October 2022. (:issue:`46312`) - :func:`read_json` now raises
FileNotFoundError(previouslyValueError) when input is a string ending in.json,.json.gz,.json.bz2, etc. but no such file exists. (:issue:`29102`) - Operations with :class:`Timestamp` or :class:`Timedelta` that would previously raise
OverflowErrorinstead raiseOutOfBoundsDatetimeorOutOfBoundsTimedeltawhere appropriate (:issue:`47268`) - When :func:`read_sas` previously returned
None, it now returns an empty :class:`DataFrame` (:issue:`47410`)
In a future version, integer slicing on a :class:`Series` with a :class:`Int64Index` or :class:`RangeIndex` will be treated as label-based, not positional. This will make the behavior consistent with other :meth:`Series.__getitem__` and :meth:`Series.__setitem__` behaviors (:issue:`45162`).
For example:
.. ipython:: python ser = pd.Series([1, 2, 3, 4, 5], index=[2, 3, 5, 7, 11])
In the old behavior, ser[2:4] treats the slice as positional:
Old behavior:
In [3]: ser[2:4]
Out[3]:
5 3
7 4
dtype: int64
In a future version, this will be treated as label-based:
Future behavior:
In [4]: ser.loc[2:4]
Out[4]:
2 1
3 2
dtype: int64
To retain the old behavior, use series.iloc[i:j]. To get the future behavior,
use series.loc[i:j].
Slicing on a :class:`DataFrame` will not be affected.
:class:`ExcelWriter` attributes
All attributes of :class:`ExcelWriter` were previously documented as not
public. However some third party Excel engines documented accessing
ExcelWriter.book or ExcelWriter.sheets, and users were utilizing these
and possibly other attributes. Previously these attributes were not safe to use;
e.g. modifications to ExcelWriter.book would not update ExcelWriter.sheets
and conversely. In order to support this, pandas has made some attributes public
and improved their implementations so that they may now be safely used. (:issue:`45572`)
The following attributes are now public and considered safe to access.
bookcheck_extensionclosedate_formatdatetime_formatengineif_sheet_existssheetssupported_extensions
The following attributes have been deprecated. They now raise a FutureWarning
when accessed and will be removed in a future version. Users should be aware
that their usage is considered unsafe, and can lead to unexpected results.
cur_sheethandlespathsavewrite_cells
See the documentation of :class:`ExcelWriter` for further details.
Using group_keys with transformers in :meth:`.GroupBy.apply`
In previous versions of pandas, if it was inferred that the function passed to
:meth:`.GroupBy.apply` was a transformer (i.e. the resulting index was equal to
the input index), the group_keys argument of :meth:`DataFrame.groupby` and
:meth:`Series.groupby` was ignored and the group keys would never be added to
the index of the result. In the future, the group keys will be added to the index
when the user specifies group_keys=True.
As group_keys=True is the default value of :meth:`DataFrame.groupby` and
:meth:`Series.groupby`, not specifying group_keys with a transformer will
raise a FutureWarning. This can be silenced and the previous behavior
retained by specifying group_keys=False.
Most of the time setting values with frame.iloc attempts to set values
inplace, only falling back to inserting a new array if necessary. There are
some cases where this rule is not followed, for example when setting an entire
column from an array with different dtype:
.. ipython:: python
df = pd.DataFrame({'price': [11.1, 12.2]}, index=['book1', 'book2'])
original_prices = df['price']
new_prices = np.array([98, 99])
Old behavior:
In [3]: df.iloc[:, 0] = new_prices
In [4]: df.iloc[:, 0]
Out[4]:
book1 98
book2 99
Name: price, dtype: int64
In [5]: original_prices
Out[5]:
book1 11.1
book2 12.2
Name: price, float: 64
This behavior is deprecated. In a future version, setting an entire column with iloc will attempt to operate inplace.
Future behavior:
In [3]: df.iloc[:, 0] = new_prices
In [4]: df.iloc[:, 0]
Out[4]:
book1 98.0
book2 99.0
Name: price, dtype: float64
In [5]: original_prices
Out[5]:
book1 98.0
book2 99.0
Name: price, dtype: float64
To get the old behavior, use :meth:`DataFrame.__setitem__` directly:
In [3]: df[df.columns[0]] = new_prices
In [4]: df.iloc[:, 0]
Out[4]
book1 98
book2 99
Name: price, dtype: int64
In [5]: original_prices
Out[5]:
book1 11.1
book2 12.2
Name: price, dtype: float64
To get the old behaviour when df.columns is not unique and you want to
change a single column by index, you can use :meth:`DataFrame.isetitem`, which
has been added in pandas 1.5:
In [3]: df_with_duplicated_cols = pd.concat([df, df], axis='columns')
In [3]: df_with_duplicated_cols.isetitem(0, new_prices)
In [4]: df_with_duplicated_cols.iloc[:, 0]
Out[4]:
book1 98
book2 99
Name: price, dtype: int64
In [5]: original_prices
Out[5]:
book1 11.1
book2 12.2
Name: 0, dtype: float64
Across the :class:`DataFrame`, :class:`.DataFrameGroupBy`, and :class:`.Resampler` operations such as
min, sum, and idxmax, the default
value of the numeric_only argument, if it exists at all, was inconsistent.
Furthermore, operations with the default value None can lead to surprising
results. (:issue:`46560`)
In [1]: df = pd.DataFrame({"a": [1, 2], "b": ["x", "y"]})
In [2]: # Reading the next line without knowing the contents of df, one would
# expect the result to contain the products for both columns a and b.
df[["a", "b"]].prod()
Out[2]:
a 2
dtype: int64
To avoid this behavior, the specifying the value numeric_only=None has been
deprecated, and will be removed in a future version of pandas. In the future,
all operations with a numeric_only argument will default to False. Users
should either call the operation only with columns that can be operated on, or
specify numeric_only=True to operate only on Boolean, integer, and float columns.
In order to support the transition to the new behavior, the following methods have
gained the numeric_only argument.
- :meth:`DataFrame.corr`
- :meth:`DataFrame.corrwith`
- :meth:`DataFrame.cov`
- :meth:`DataFrame.idxmin`
- :meth:`DataFrame.idxmax`
- :meth:`.DataFrameGroupBy.cummin`
- :meth:`.DataFrameGroupBy.cummax`
- :meth:`.DataFrameGroupBy.idxmin`
- :meth:`.DataFrameGroupBy.idxmax`
- :meth:`.GroupBy.var`
- :meth:`.GroupBy.std`
- :meth:`.GroupBy.sem`
- :meth:`.DataFrameGroupBy.quantile`
- :meth:`.Resampler.mean`
- :meth:`.Resampler.median`
- :meth:`.Resampler.sem`
- :meth:`.Resampler.std`
- :meth:`.Resampler.var`
- :meth:`DataFrame.rolling` operations
- :meth:`DataFrame.expanding` operations
- :meth:`DataFrame.ewm` operations
- Deprecated the keyword
line_terminatorin :meth:`DataFrame.to_csv` and :meth:`Series.to_csv`, uselineterminatorinstead; this is for consistency with :func:`read_csv` and the standard library 'csv' module (:issue:`9568`) - Deprecated behavior of :meth:`SparseArray.astype`, :meth:`Series.astype`, and :meth:`DataFrame.astype` with :class:`SparseDtype` when passing a non-sparse
dtype. In a future version, this will cast to that non-sparse dtype instead of wrapping it in a :class:`SparseDtype` (:issue:`34457`) - Deprecated behavior of :meth:`DatetimeIndex.intersection` and :meth:`DatetimeIndex.symmetric_difference` (
unionbehavior was already deprecated in version 1.3.0) with mixed time zones; in a future version both will be cast to UTC instead of object dtype (:issue:`39328`, :issue:`45357`) - Deprecated :meth:`DataFrame.iteritems`, :meth:`Series.iteritems`, :meth:`HDFStore.iteritems` in favor of :meth:`DataFrame.items`, :meth:`Series.items`, :meth:`HDFStore.items` (:issue:`45321`)
- Deprecated :meth:`Series.is_monotonic` and :meth:`Index.is_monotonic` in favor of :meth:`Series.is_monotonic_increasing` and :meth:`Index.is_monotonic_increasing` (:issue:`45422`, :issue:`21335`)
- Deprecated behavior of :meth:`DatetimeIndex.astype`, :meth:`TimedeltaIndex.astype`, :meth:`PeriodIndex.astype` when converting to an integer dtype other than
int64. In a future version, these will convert to exactly the specified dtype (instead of alwaysint64) and will raise if the conversion overflows (:issue:`45034`) - Deprecated the
__array_wrap__method of DataFrame and Series, rely on standard numpy ufuncs instead (:issue:`45451`) - Deprecated treating float-dtype data as wall-times when passed with a timezone to :class:`Series` or :class:`DatetimeIndex` (:issue:`45573`)
- Deprecated the behavior of :meth:`Series.fillna` and :meth:`DataFrame.fillna` with
timedelta64[ns]dtype and incompatible fill value; in a future version this will cast to a common dtype (usually object) instead of raising, matching the behavior of other dtypes (:issue:`45746`) - Deprecated the
warnparameter in :func:`infer_freq` (:issue:`45947`) - Deprecated allowing non-keyword arguments in :meth:`.ExtensionArray.argsort` (:issue:`46134`)
- Deprecated treating all-bool
object-dtype columns as bool-like in :meth:`DataFrame.any` and :meth:`DataFrame.all` withbool_only=True, explicitly cast to bool instead (:issue:`46188`) - Deprecated behavior of method :meth:`DataFrame.quantile`, attribute
numeric_onlywill default False. Including datetime/timedelta columns in the result (:issue:`7308`). - Deprecated :attr:`Timedelta.freq` and :attr:`Timedelta.is_populated` (:issue:`46430`)
- Deprecated :attr:`Timedelta.delta` (:issue:`46476`)
- Deprecated passing arguments as positional in :meth:`DataFrame.any` and :meth:`Series.any` (:issue:`44802`)
- Deprecated the
closedargument in :meth:`interval_range` in favor ofinclusiveargument; In a future version passingclosedwill raise (:issue:`40245`) - Deprecated the methods :meth:`DataFrame.mad`, :meth:`Series.mad`, and the corresponding groupby methods (:issue:`11787`)
- Deprecated positional arguments to :meth:`Index.join` except for
other, use keyword-only arguments instead of positional arguments (:issue:`46518`) - Deprecated positional arguments to :meth:`StringMethods.rsplit` and :meth:`StringMethods.split` except for
pat, use keyword-only arguments instead of positional arguments (:issue:`47423`) - Deprecated indexing on a timezone-naive :class:`DatetimeIndex` using a string representing a timezone-aware datetime (:issue:`46903`, :issue:`36148`)
- Deprecated the
closedargument in :class:`Interval` in favor ofinclusiveargument; In a future version passingclosedwill raise (:issue:`40245`) - Deprecated the
closedargument in :class:`IntervalIndex` in favor ofinclusiveargument; In a future version passingclosedwill raise (:issue:`40245`) - Deprecated the
closedargument in :class:`IntervalDtype` in favor ofinclusiveargument; In a future version passingclosedwill raise (:issue:`40245`) - Deprecated the
closedargument in :class:`.IntervalArray` in favor ofinclusiveargument; In a future version passingclosedwill raise (:issue:`40245`) - Deprecated the
closedargument in :class:`IntervalTree` in favor ofinclusiveargument; In a future version passingclosedwill raise (:issue:`40245`) - Deprecated the
closedargument in :class:`ArrowInterval` in favor ofinclusiveargument; In a future version passingclosedwill raise (:issue:`40245`) - Deprecated allowing
unit="M"orunit="Y"in :class:`Timestamp` constructor with a non-round float value (:issue:`47267`) - Deprecated the
display.column_spaceglobal configuration option (:issue:`7576`) - Deprecated the argument
na_sentinelin :func:`factorize`, :meth:`Index.factorize`, and :meth:`.ExtensionArray.factorize`; passuse_na_sentinel=Trueinstead to use the sentinel-1for NaN values anduse_na_sentinel=Falseinstead ofna_sentinel=Noneto encode NaN values (:issue:`46910`) - Deprecated :meth:`DataFrameGroupBy.transform` not aligning the result when the UDF returned DataFrame (:issue:`45648`)
- Clarified warning from :func:`to_datetime` when delimited dates can't be parsed in accordance to specified
dayfirstargument (:issue:`46210`) - Deprecated :class:`Series` and :class:`Resampler` reducers (e.g.
min,max,sum,mean) raising aNotImplementedErrorwhen the dtype is non-numric andnumeric_only=Trueis provided; this will raise aTypeErrorin a future version (:issue:`47500`) - Deprecated :meth:`Series.rank` returning an empty result when the dtype is non-numeric and
numeric_only=Trueis provided; this will raise aTypeErrorin a future version (:issue:`47500`)
- Performance improvement in :meth:`DataFrame.corrwith` for column-wise (axis=0) Pearson and Spearman correlation when other is a :class:`Series` (:issue:`46174`)
- Performance improvement in :meth:`.GroupBy.transform` for some user-defined DataFrame -> Series functions (:issue:`45387`)
- Performance improvement in :meth:`DataFrame.duplicated` when subset consists of only one column (:issue:`45236`)
- Performance improvement in :meth:`.GroupBy.diff` (:issue:`16706`)
- Performance improvement in :meth:`.GroupBy.transform` when broadcasting values for user-defined functions (:issue:`45708`)
- Performance improvement in :meth:`.GroupBy.transform` for user-defined functions when only a single group exists (:issue:`44977`)
- Performance improvement in :meth:`.GroupBy.apply` when grouping on a non-unique unsorted index (:issue:`46527`)
- Performance improvement in :meth:`DataFrame.loc` and :meth:`Series.loc` for tuple-based indexing of a :class:`MultiIndex` (:issue:`45681`, :issue:`46040`, :issue:`46330`)
- Performance improvement in :meth:`DataFrame.to_records` when the index is a :class:`MultiIndex` (:issue:`47263`)
- Performance improvement in :attr:`MultiIndex.values` when the MultiIndex contains levels of type DatetimeIndex, TimedeltaIndex or ExtensionDtypes (:issue:`46288`)
- Performance improvement in :func:`merge` when left and/or right are empty (:issue:`45838`)
- Performance improvement in :meth:`DataFrame.join` when left and/or right are empty (:issue:`46015`)
- Performance improvement in :meth:`DataFrame.reindex` and :meth:`Series.reindex` when target is a :class:`MultiIndex` (:issue:`46235`)
- Performance improvement when setting values in a pyarrow backed string array (:issue:`46400`)
- Performance improvement in :func:`factorize` (:issue:`46109`)
- Performance improvement in :class:`DataFrame` and :class:`Series` constructors for extension dtype scalars (:issue:`45854`)
- Performance improvement in :func:`read_excel` when
nrowsargument provided (:issue:`32727`) - Performance improvement in :meth:`.Styler.to_excel` when applying repeated CSS formats (:issue:`47371`)
- Performance improvement in :meth:`MultiIndex.is_monotonic_increasing` (:issue:`47458`)
- Performance improvement in :class:`BusinessHour`
strandrepr(:issue:`44764`) - Performance improvement in datetime arrays string formatting when one of the default strftime formats
"%Y-%m-%d %H:%M:%S"or"%Y-%m-%d %H:%M:%S.%f"is used. (:issue:`44764`) - Performance improvement in :meth:`Series.to_sql` and :meth:`DataFrame.to_sql` (:class:`SQLiteTable`) when processing time arrays. (:issue:`44764`)
- Bug in :meth:`.Categorical.view` not accepting integer dtypes (:issue:`25464`)
- Bug in :meth:`.CategoricalIndex.union` when the index's categories are integer-dtype and the index contains
NaNvalues incorrectly raising instead of casting tofloat64(:issue:`45362`)
- Bug in :meth:`DataFrame.quantile` with datetime-like dtypes and no rows incorrectly returning
float64dtype instead of retaining datetime-like dtype (:issue:`41544`) - Bug in :func:`to_datetime` with sequences of
np.str_objects incorrectly raising (:issue:`32264`) - Bug in :class:`Timestamp` construction when passing datetime components as positional arguments and
tzinfoas a keyword argument incorrectly raising (:issue:`31929`) - Bug in :meth:`Index.astype` when casting from object dtype to
timedelta64[ns]dtype incorrectly castingnp.datetime64("NaT")values tonp.timedelta64("NaT")instead of raising (:issue:`45722`) - Bug in :meth:`SeriesGroupBy.value_counts` index when passing categorical column (:issue:`44324`)
- Bug in :meth:`DatetimeIndex.tz_localize` localizing to UTC failing to make a copy of the underlying data (:issue:`46460`)
- Bug in :meth:`DatetimeIndex.resolution` incorrectly returning "day" instead of "nanosecond" for nanosecond-resolution indexes (:issue:`46903`)
- Bug in :class:`Timestamp` with an integer or float value and
unit="Y"orunit="M"giving slightly-wrong results (:issue:`47266`) - Bug in :class:`.DatetimeArray` construction when passed another :class:`.DatetimeArray` and
freq=Noneincorrectly inferring the freq from the given array (:issue:`47296`)
- Bug in :func:`astype_nansafe` astype("timedelta64[ns]") fails when np.nan is included (:issue:`45798`)
- Bug in constructing a :class:`Timedelta` with a
np.timedelta64object and aunitsometimes silently overflowing and returning incorrect results instead of raisingOutOfBoundsTimedelta(:issue:`46827`) - Bug in constructing a :class:`Timedelta` from a large integer or float with
unit="W"silently overflowing and returning incorrect results instead of raisingOutOfBoundsTimedelta(:issue:`47268`)
- Bug in :class:`Timestamp` constructor raising when passed a
ZoneInfotzinfo object (:issue:`46425`)
- Bug in operations with array-likes with
dtype="boolean"and :attr:`NA` incorrectly altering the array in-place (:issue:`45421`) - Bug in division,
powandmodoperations on array-likes withdtype="boolean"not being like theirnp.bool_counterparts (:issue:`46063`) - Bug in multiplying a :class:`Series` with
IntegerDtypeorFloatingDtypeby an array-like withtimedelta64[ns]dtype incorrectly raising (:issue:`45622`)
- Bug in :meth:`DataFrame.astype` not preserving subclasses (:issue:`40810`)
- Bug in constructing a :class:`Series` from a float-containing list or a floating-dtype ndarray-like (e.g.
dask.Array) and an integer dtype raising instead of casting like we would with annp.ndarray(:issue:`40110`) - Bug in :meth:`Float64Index.astype` to unsigned integer dtype incorrectly casting to
np.int64dtype (:issue:`45309`) - Bug in :meth:`Series.astype` and :meth:`DataFrame.astype` from floating dtype to unsigned integer dtype failing to raise in the presence of negative values (:issue:`45151`)
- Bug in :func:`array` with
FloatingDtypeand values containing float-castable strings incorrectly raising (:issue:`45424`) - Bug when comparing string and datetime64ns objects causing
OverflowErrorexception. (:issue:`45506`) - Bug in metaclass of generic abstract dtypes causing :meth:`DataFrame.apply` and :meth:`Series.apply` to raise for the built-in function
type(:issue:`46684`) - Bug in :meth:`DataFrame.to_records` returning inconsistent numpy types if the index was a :class:`MultiIndex` (:issue:`47263`)
- Bug in :meth:`DataFrame.to_dict` for
orient="list"ororient="index"was not returning native types (:issue:`46751`) - Bug in :meth:`DataFrame.apply` that returns a :class:`DataFrame` instead of a :class:`Series` when applied to an empty :class:`DataFrame` and
axis=1(:issue:`39111`)
- Bug in :meth:`str.startswith` and :meth:`str.endswith` when using other series as parameter _pat_. Now raises
TypeError(:issue:`3485`)
- Bug in :meth:`IntervalArray.__setitem__` when setting
np.naninto an integer-backed array raisingValueErrorinstead ofTypeError(:issue:`45484`) - Bug in :class:`IntervalDtype` when using datetime64[ns, tz] as a dtype string (:issue:`46999`)
- Bug in :meth:`loc.__getitem__` with a list of keys causing an internal inconsistency that could lead to a disconnect between
frame.at[x, y]vsframe[y].loc[x](:issue:`22372`) - Bug in :meth:`DataFrame.iloc` where indexing a single row on a :class:`DataFrame` with a single ExtensionDtype column gave a copy instead of a view on the underlying data (:issue:`45241`)
- Bug in :meth:`DataFrame.__getitem__` returning copy when :class:`DataFrame` has duplicated columns even if a unique column is selected (:issue:`45316`, :issue:`41062`)
- Bug in :meth:`Series.align` does not create :class:`MultiIndex` with union of levels when both MultiIndexes intersections are identical (:issue:`45224`)
- Bug in setting a NA value (
Noneornp.nan) into a :class:`Series` with int-based :class:`IntervalDtype` incorrectly casting to object dtype instead of a float-based :class:`IntervalDtype` (:issue:`45568`) - Bug in indexing setting values into an
ExtensionDtypecolumn withdf.iloc[:, i] = valueswithvalueshaving the same dtype asdf.iloc[:, i]incorrectly inserting a new array instead of setting in-place (:issue:`33457`) - Bug in :meth:`Series.__setitem__` with a non-integer :class:`Index` when using an integer key to set a value that cannot be set inplace where a
ValueErrorwas raised instead of casting to a common dtype (:issue:`45070`) - Bug in :meth:`Series.__setitem__` when setting incompatible values into a
PeriodDtypeorIntervalDtype:class:`Series` raising when indexing with a boolean mask but coercing when indexing with otherwise-equivalent indexers; these now consistently coerce, along with :meth:`Series.mask` and :meth:`Series.where` (:issue:`45768`) - Bug in :meth:`DataFrame.where` with multiple columns with datetime-like dtypes failing to downcast results consistent with other dtypes (:issue:`45837`)
- Bug in :func:`isin` upcasting to
float64with unsigned integer dtype and list-like argument without a dtype (:issue:`46485`) - Bug in :meth:`Series.loc.__setitem__` and :meth:`Series.loc.__getitem__` not raising when using multiple keys without using a :class:`MultiIndex` (:issue:`13831`)
- Bug in :meth:`Index.reindex` raising
AssertionErrorwhenlevelwas specified but no :class:`MultiIndex` was given; level is ignored now (:issue:`35132`) - Bug when setting a value too large for a :class:`Series` dtype failing to coerce to a common type (:issue:`26049`, :issue:`32878`)
- Bug in :meth:`loc.__setitem__` treating
rangekeys as positional instead of label-based (:issue:`45479`) - Bug in :meth:`Series.__setitem__` when setting
booleandtype values containingNAincorrectly raising instead of casting tobooleandtype (:issue:`45462`) - Bug in :meth:`Series.__setitem__` where setting :attr:`NA` into a numeric-dtype :class:`Series` would incorrectly upcast to object-dtype rather than treating the value as
np.nan(:issue:`44199`) - Bug in :meth:`DataFrame.loc` when setting values to a column and right hand side is a dictionary (:issue:`47216`)
- Bug in :meth:`DataFrame.loc` when setting a :class:`DataFrame` not aligning index in some cases (:issue:`47578`)
- Bug in :meth:`Series.__setitem__` with
datetime64[ns]dtype, an all-Falseboolean mask, and an incompatible value incorrectly casting toobjectinstead of retainingdatetime64[ns]dtype (:issue:`45967`) - Bug in :meth:`Index.__getitem__` raising
ValueErrorwhen indexer is from boolean dtype withNA(:issue:`45806`) - Bug in :meth:`Series.__setitem__` losing precision when enlarging :class:`Series` with scalar (:issue:`32346`)
- Bug in :meth:`Series.mask` with
inplace=Trueor setting values with a boolean mask with small integer dtypes incorrectly raising (:issue:`45750`) - Bug in :meth:`DataFrame.mask` with
inplace=TrueandExtensionDtypecolumns incorrectly raising (:issue:`45577`) - Bug in getting a column from a DataFrame with an object-dtype row index with datetime-like values: the resulting Series now preserves the exact object-dtype Index from the parent DataFrame (:issue:`42950`)
- Bug in :meth:`DataFrame.__getattribute__` raising
AttributeErrorif columns have"string"dtype (:issue:`46185`) - Bug in indexing on a :class:`DatetimeIndex` with a
np.str_key incorrectly raising (:issue:`45580`) - Bug in :meth:`CategoricalIndex.get_indexer` when index contains
NaNvalues, resulting in elements that are in target but not present in the index to be mapped to the index of the NaN element, instead of -1 (:issue:`45361`) - Bug in setting large integer values into :class:`Series` with
float32orfloat16dtype incorrectly altering these values instead of coercing tofloat64dtype (:issue:`45844`) - Bug in :meth:`Series.asof` and :meth:`DataFrame.asof` incorrectly casting bool-dtype results to
float64dtype (:issue:`16063`) - Bug in :meth:`NDFrame.xs`, :meth:`DataFrame.iterrows`, :meth:`DataFrame.loc` and :meth:`DataFrame.iloc` not always propagating metadata (:issue:`28283`)
- Bug in :meth:`DataFrame.sum` min_count changes dtype if input contains NaNs (:issue:`46947`)
- Bug in :class:`IntervalTree` that lead to an infinite recursion. (:issue:`46658`)
- Bug in :meth:`Series.fillna` and :meth:`DataFrame.fillna` with
downcastkeyword not being respected in some cases where there are no NA values present (:issue:`45423`) - Bug in :meth:`Series.fillna` and :meth:`DataFrame.fillna` with :class:`IntervalDtype` and incompatible value raising instead of casting to a common (usually object) dtype (:issue:`45796`)
- Bug in :meth:`DataFrame.interpolate` with object-dtype column not returning a copy with
inplace=False(:issue:`45791`) - Bug in :meth:`DataFrame.dropna` allows to set both
howandthreshincompatible arguments (:issue:`46575`)
- Bug in :meth:`DataFrame.loc` returning empty result when slicing a :class:`MultiIndex` with a negative step size and non-null start/stop values (:issue:`46156`)
- Bug in :meth:`DataFrame.loc` raising when slicing a :class:`MultiIndex` with a negative step size other than -1 (:issue:`46156`)
- Bug in :meth:`DataFrame.loc` raising when slicing a :class:`MultiIndex` with a negative step size and slicing a non-int labeled index level (:issue:`46156`)
- Bug in :meth:`Series.to_numpy` where multiindexed Series could not be converted to numpy arrays when an
na_valuewas supplied (:issue:`45774`) - Bug in :class:`MultiIndex.equals` not commutative when only one side has extension array dtype (:issue:`46026`)
- Bug in :meth:`MultiIndex.from_tuples` cannot construct Index of empty tuples (:issue:`45608`)
- Bug in :meth:`DataFrame.to_stata` where no error is raised if the :class:`DataFrame` contains
-np.inf(:issue:`45350`) - Bug in :func:`read_excel` results in an infinite loop with certain
skiprowscallables (:issue:`45585`) - Bug in :meth:`DataFrame.info` where a new line at the end of the output is omitted when called on an empty :class:`DataFrame` (:issue:`45494`)
- Bug in :func:`read_csv` not recognizing line break for
on_bad_lines="warn"forengine="c"(:issue:`41710`) - Bug in :meth:`DataFrame.to_csv` not respecting
float_formatforFloat64dtype (:issue:`45991`) - Bug in :func:`read_csv` not respecting a specified converter to index columns in all cases (:issue:`40589`)
- Bug in :func:`read_csv` interpreting second row as :class:`Index` names even when
index_col=False(:issue:`46569`) - Bug in :func:`read_parquet` when
engine="pyarrow"which caused partial write to disk when column of unsupported datatype was passed (:issue:`44914`) - Bug in :func:`DataFrame.to_excel` and :class:`ExcelWriter` would raise when writing an empty DataFrame to a
.odsfile (:issue:`45793`) - Bug in :func:`read_csv` ignoring non-existing header row for
engine="python"(:issue:`47400`) - Bug in :func:`read_excel` raising uncontrolled
IndexErrorwhenheaderreferences non-existing rows (:issue:`43143`) - Bug in :func:`read_html` where elements surrounding
<br>were joined without a space between them (:issue:`29528`) - Bug in :func:`read_csv` when data is longer than header leading to issues with callables in
usecolsexpecting strings (:issue:`46997`) - Bug in Parquet roundtrip for Interval dtype with
datetime64[ns]subtype (:issue:`45881`) - Bug in :func:`read_excel` when reading a
.odsfile with newlines between xml elements (:issue:`45598`) - Bug in :func:`read_parquet` when
engine="fastparquet"where the file was not closed on error (:issue:`46555`) - :meth:`to_html` now excludes the
borderattribute from<table>elements whenborderkeyword is set toFalse. - Bug in :func:`read_sas` with certain types of compressed SAS7BDAT files (:issue:`35545`)
- Bug in :func:`read_excel` not forward filling :class:`MultiIndex` when no names were given (:issue:`47487`)
- Bug in :func:`read_sas` returned
Nonerather than an empty DataFrame for SAS7BDAT files with zero rows (:issue:`18198`) - Bug in :class:`StataWriter` where value labels were always written with default encoding (:issue:`46750`)
- Bug in :class:`StataWriterUTF8` where some valid characters were removed from variable names (:issue:`47276`)
- Bug in :meth:`DataFrame.to_excel` when writing an empty dataframe with :class:`MultiIndex` (:issue:`19543`)
- Bug in :func:`read_sas` with RLE-compressed SAS7BDAT files that contain 0x40 control bytes (:issue:`31243`)
- Bug in :func:`read_sas` that scrambled column names (:issue:`31243`)
- Bug in :func:`read_sas` with RLE-compressed SAS7BDAT files that contain 0x00 control bytes (:issue:`47099`)
- Bug in :func:`read_parquet` with
use_nullable_dtypes=Truewherefloat64dtype was returned instead of nullableFloat64dtype (:issue:`45694`)
- Bug in subtraction of :class:`Period` from :class:`.PeriodArray` returning wrong results (:issue:`45999`)
- Bug in :meth:`Period.strftime` and :meth:`PeriodIndex.strftime`, directives
%land%uwere giving wrong results (:issue:`46252`) - Bug in inferring an incorrect
freqwhen passing a string to :class:`Period` microseconds that are a multiple of 1000 (:issue:`46811`) - Bug in constructing a :class:`Period` from a :class:`Timestamp` or
np.datetime64object with non-zero nanoseconds andfreq="ns"incorrectly truncating the nanoseconds (:issue:`46811`) - Bug in adding
np.timedelta64("NaT", "ns")to a :class:`Period` with a timedelta-like freq incorrectly raisingIncompatibleFrequencyinstead of returningNaT(:issue:`47196`) - Bug in adding an array of integers to an array with :class:`PeriodDtype` giving incorrect results when
dtype.freq.n > 1(:issue:`47209`) - Bug in subtracting a :class:`Period` from an array with :class:`PeriodDtype` returning incorrect results instead of raising
OverflowErrorwhen the operation overflows (:issue:`47538`)
- Bug in :meth:`DataFrame.plot.barh` that prevented labeling the x-axis and
xlabelupdating the y-axis label (:issue:`45144`) - Bug in :meth:`DataFrame.plot.box` that prevented labeling the x-axis (:issue:`45463`)
- Bug in :meth:`DataFrame.boxplot` that prevented passing in
xlabelandylabel(:issue:`45463`) - Bug in :meth:`DataFrame.boxplot` that prevented specifying
vert=False(:issue:`36918`) - Bug in :meth:`DataFrame.plot.scatter` that prevented specifying
norm(:issue:`45809`) - The function :meth:`DataFrame.plot.scatter` now accepts
coloras an alias forcandsizeas an alias forsfor consistency to other plotting functions (:issue:`44670`) - Fix showing "None" as ylabel in :meth:`Series.plot` when not setting ylabel (:issue:`46129`)
- Bug in :meth:`DataFrame.resample` ignoring
closed="right"on :class:`TimedeltaIndex` (:issue:`45414`) - Bug in :meth:`.DataFrameGroupBy.transform` fails when
func="size"and the input DataFrame has multiple columns (:issue:`27469`) - Bug in :meth:`.DataFrameGroupBy.size` and :meth:`.DataFrameGroupBy.transform` with
func="size"produced incorrect results whenaxis=1(:issue:`45715`) - Bug in :meth:`.ExponentialMovingWindow.mean` with
axis=1andengine='numba'when the :class:`DataFrame` has more columns than rows (:issue:`46086`) - Bug when using
engine="numba"would return the same jitted function when modifyingengine_kwargs(:issue:`46086`) - Bug in :meth:`.DataFrameGroupBy.transform` fails when
axis=1andfuncis"first"or"last"(:issue:`45986`) - Bug in :meth:`DataFrameGroupBy.cumsum` with
skipna=Falsegiving incorrect results (:issue:`46216`) - Bug in :meth:`.GroupBy.cumsum` with
timedelta64[ns]dtype failing to recognizeNaTas a null value (:issue:`46216`) - Bug in :meth:`.GroupBy.cummin` and :meth:`.GroupBy.cummax` with nullable dtypes incorrectly altering the original data in place (:issue:`46220`)
- Bug in :meth:`DataFrame.groupby` raising error when
Noneis in first level of :class:`MultiIndex` (:issue:`47348`) - Bug in :meth:`.GroupBy.cummax` with
int64dtype with leading value being the smallest possible int64 (:issue:`46382`) - Bug in :meth:`.GroupBy.max` with empty groups and
uint64dtype incorrectly raisingRuntimeError(:issue:`46408`) - Bug in :meth:`.GroupBy.apply` would fail when
funcwas a string and args or kwargs were supplied (:issue:`46479`) - Bug in :meth:`SeriesGroupBy.apply` would incorrectly name its result when there was a unique group (:issue:`46369`)
- Bug in :meth:`.Rolling.sum` and :meth:`.Rolling.mean` would give incorrect result with window of same values (:issue:`42064`, :issue:`46431`)
- Bug in :meth:`.Rolling.var` and :meth:`.Rolling.std` would give non-zero result with window of same values (:issue:`42064`)
- Bug in :meth:`.Rolling.skew` and :meth:`.Rolling.kurt` would give NaN with window of same values (:issue:`30993`)
- Bug in :meth:`.Rolling.var` would segfault calculating weighted variance when window size was larger than data size (:issue:`46760`)
- Bug in :meth:`Grouper.__repr__` where
dropnawas not included. Now it is (:issue:`46754`) - Bug in :meth:`DataFrame.rolling` gives ValueError when center=True, axis=1 and win_type is specified (:issue:`46135`)
- Bug in :meth:`.DataFrameGroupBy.describe` and :meth:`.SeriesGroupBy.describe` produces inconsistent results for empty datasets (:issue:`41575`)
- Bug in :meth:`DataFrame.resample` reduction methods when used with
onwould attempt to aggregate the provided column (:issue:`47079`) - Bug in :meth:`DataFrame.groupby` and :meth:`Series.groupby` would not respect
dropna=Falsewhen the input DataFrame/Series had a NaN values in a :class:`MultiIndex` (:issue:`46783`)
- Bug in :func:`concat` between a :class:`Series` with integer dtype and another with :class:`CategoricalDtype` with integer categories and containing
NaNvalues casting to object dtype instead offloat64(:issue:`45359`) - Bug in :func:`get_dummies` that selected object and categorical dtypes but not string (:issue:`44965`)
- Bug in :meth:`DataFrame.align` when aligning a :class:`MultiIndex` to a :class:`Series` with another :class:`MultiIndex` (:issue:`46001`)
- Bug in concatenation with
IntegerDtype, orFloatingDtypearrays where the resulting dtype did not mirror the behavior of the non-nullable dtypes (:issue:`46379`) - Bug in :func:`concat` losing dtype of columns when
join="outer"andsort=True(:issue:`47329`) - Bug in :func:`concat` not sorting the column names when
Noneis included (:issue:`47331`) - Bug in :func:`concat` with identical key leads to error when indexing :class:`MultiIndex` (:issue:`46519`)
- Bug in :meth:`DataFrame.join` with a list when using suffixes to join DataFrames with duplicate column names (:issue:`46396`)
- Bug in :meth:`DataFrame.pivot_table` with
sort=Falseresults in sorted index (:issue:`17041`)
- Bug in :meth:`Series.where` and :meth:`DataFrame.where` with
SparseDtypefailing to retain the array'sfill_value(:issue:`45691`)
- Bug in :meth:`IntegerArray.searchsorted` and :meth:`FloatingArray.searchsorted` returning inconsistent results when acting on
np.nan(:issue:`45255`)
- Bug when attempting to apply styling functions to an empty DataFrame subset (:issue:`45313`)
- Bug in :class:`CSSToExcelConverter` leading to
TypeErrorwhen border color provided without border style forxlsxwriterengine (:issue:`42276`) - Bug in :meth:`Styler.set_sticky` leading to white text on white background in dark mode (:issue:`46984`)
- Bug in :meth:`Styler.to_latex` causing
UnboundLocalErrorwhenclines="all;data"and theDataFramehas no rows. (:issue:`47203`) - Bug in :meth:`Styler.to_excel` when using
vertical-align: middle;withxlsxwriterengine (:issue:`30107`)
- Fixed metadata propagation in :meth:`DataFrame.melt` (:issue:`28283`)
- Fixed metadata propagation in :meth:`DataFrame.explode` (:issue:`28283`)
- Bug in :func:`.assert_index_equal` with
names=Trueandcheck_order=Falsenot checking names (:issue:`47328`)