These are the changes in pandas 1.3.0. See :ref:`release` for a full changelog including other versions of pandas.
{{ header }}
Warning
When reading new Excel 2007+ (.xlsx
) files, the default argument
engine=None
to :func:`read_excel` will now result in using the
openpyxl engine in all cases
when the option :attr:`io.excel.xlsx.reader` is set to "auto"
.
Previously, some cases would use the
xlrd engine instead. See
:ref:`What's new 1.2.0 <whatsnew_120>` for background on this change.
When reading from a remote URL that is not handled by fsspec (e.g. HTTP and
HTTPS) the dictionary passed to storage_options
will be used to create the
headers included in the request. This can be used to control the User-Agent
header or send other custom headers (:issue:`36688`).
For example:
In [1]: headers = {"User-Agent": "pandas"}
In [2]: df = pd.read_csv(
...: "https://download.bls.gov/pub/time.series/cu/cu.item",
...: sep="\t",
...: storage_options=headers
...: )
We added I/O support to read and render shallow versions of XML documents with :func:`read_xml` and :meth:`DataFrame.to_xml`. Using lxml as parser, both XPath 1.0 and XSLT 1.0 are available. (:issue:`27554`)
In [1]: xml = """<?xml version='1.0' encoding='utf-8'?>
...: <data>
...: <row>
...: <shape>square</shape>
...: <degrees>360</degrees>
...: <sides>4.0</sides>
...: </row>
...: <row>
...: <shape>circle</shape>
...: <degrees>360</degrees>
...: <sides/>
...: </row>
...: <row>
...: <shape>triangle</shape>
...: <degrees>180</degrees>
...: <sides>3.0</sides>
...: </row>
...: </data>"""
In [2]: df = pd.read_xml(xml)
In [3]: df
Out[3]:
shape degrees sides
0 square 360 4.0
1 circle 360 NaN
2 triangle 180 3.0
In [4]: df.to_xml()
Out[4]:
<?xml version='1.0' encoding='utf-8'?>
<data>
<row>
<index>0</index>
<shape>square</shape>
<degrees>360</degrees>
<sides>4.0</sides>
</row>
<row>
<index>1</index>
<shape>circle</shape>
<degrees>360</degrees>
<sides/>
</row>
<row>
<index>2</index>
<shape>triangle</shape>
<degrees>180</degrees>
<sides>3.0</sides>
</row>
</data>
For more, see :ref:`io.xml` in the user guide on IO tools.
We provided some focused development on :class:`.Styler`. See also the Styler documentation which has been revised and improved (:issue:`39720`, :issue:`39317`, :issue:`40493`).
- The method :meth:`.Styler.set_table_styles` can now accept more natural CSS language for arguments, such as
'color:red;'
instead of[('color', 'red')]
(:issue:`39563`)- The methods :meth:`.Styler.highlight_null`, :meth:`.Styler.highlight_min`, and :meth:`.Styler.highlight_max` now allow custom CSS highlighting instead of the default background coloring (:issue:`40242`)
- :meth:`.Styler.apply` now accepts functions that return an
ndarray
whenaxis=None
, making it now consistent with theaxis=0
andaxis=1
behavior (:issue:`39359`)- When incorrectly formatted CSS is given via :meth:`.Styler.apply` or :meth:`.Styler.applymap`, an error is now raised upon rendering (:issue:`39660`)
- :meth:`.Styler.format` now accepts the keyword argument
escape
for optional HTML and LaTeX escaping (:issue:`40388`, :issue:`41619`)- :meth:`.Styler.background_gradient` has gained the argument
gmap
to supply a specific gradient map for shading (:issue:`22727`)- :meth:`.Styler.clear` now clears :attr:`Styler.hidden_index` and :attr:`Styler.hidden_columns` as well (:issue:`40484`)
- Added the method :meth:`.Styler.highlight_between` (:issue:`39821`)
- Added the method :meth:`.Styler.highlight_quantile` (:issue:`40926`)
- Added the method :meth:`.Styler.text_gradient` (:issue:`41098`)
- Added the method :meth:`.Styler.set_tooltips` to allow hover tooltips; this can be used enhance interactive displays (:issue:`21266`, :issue:`40284`)
- Added the parameter
precision
to the method :meth:`.Styler.format` to control the display of floating point numbers (:issue:`40134`)- :class:`.Styler` rendered HTML output now follows the w3 HTML Style Guide (:issue:`39626`)
- Many features of the :class:`.Styler` class are now either partially or fully usable on a DataFrame with a non-unique indexes or columns (:issue:`41143`)
- One has greater control of the display through separate sparsification of the index or columns using the :ref:`new styler options <options.available>`, which are also usable via :func:`option_context` (:issue:`41142`)
- Added the option
styler.render.max_elements
to avoid browser overload when styling large DataFrames (:issue:`40712`)- Added the method :meth:`.Styler.to_latex` (:issue:`21673`, :issue:`42320`), which also allows some limited CSS conversion (:issue:`40731`)
- Added the method :meth:`.Styler.to_html` (:issue:`13379`)
- Added the method :meth:`.Styler.set_sticky` to make index and column headers permanently visible in scrolling HTML frames (:issue:`29072`)
When passing a dictionary to :class:`DataFrame` with copy=False
,
a copy will no longer be made (:issue:`32960`).
.. ipython:: python arr = np.array([1, 2, 3]) df = pd.DataFrame({"A": arr, "B": arr.copy()}, copy=False) df
df["A"]
remains a view on arr
:
.. ipython:: python arr[0] = 0 assert df.iloc[0, 0] == 0
The default behavior when not passing copy
will remain unchanged, i.e.
a copy will be made.
We've enhanced the :class:`StringDtype`, an extension type dedicated to string data. (:issue:`39908`)
It is now possible to specify a storage
keyword option to :class:`StringDtype`. Use
pandas options or specify the dtype using dtype='string[pyarrow]'
to allow the
StringArray to be backed by a PyArrow array instead of a NumPy array of Python objects.
The PyArrow backed StringArray requires pyarrow 1.0.0 or greater to be installed.
Warning
string[pyarrow]
is currently considered experimental. The implementation
and parts of the API may change without warning.
.. ipython:: python pd.Series(['abc', None, 'def'], dtype=pd.StringDtype(storage="pyarrow"))
You can use the alias "string[pyarrow]"
as well.
.. ipython:: python s = pd.Series(['abc', None, 'def'], dtype="string[pyarrow]") s
You can also create a PyArrow backed string array using pandas options.
.. ipython:: python with pd.option_context("string_storage", "pyarrow"): s = pd.Series(['abc', None, 'def'], dtype="string") s
The usual string accessor methods work. Where appropriate, the return type of the Series or columns of a DataFrame will also have string dtype.
.. ipython:: python s.str.upper() s.str.split('b', expand=True).dtypes
String accessor methods returning integers will return a value with :class:`Int64Dtype`
.. ipython:: python s.str.count("a")
When performing rolling calculations on DataFrame and Series objects with a datetime-like index, a centered datetime-like window can now be used (:issue:`38780`). For example:
.. ipython:: python df = pd.DataFrame( {"A": [0, 1, 2, 3, 4]}, index=pd.date_range("2020", periods=5, freq="1D") ) df df.rolling("2D", center=True).mean()
- :meth:`DataFrame.rolling`, :meth:`Series.rolling`, :meth:`DataFrame.expanding`, and :meth:`Series.expanding` now support a
method
argument with a'table'
option that performs the windowing operation over an entire :class:`DataFrame`. See :ref:`Window Overview <window.overview>` for performance and functional benefits (:issue:`15095`, :issue:`38995`) - :class:`.ExponentialMovingWindow` now support a
online
method that can performmean
calculations in an online fashion. See :ref:`Window Overview <window.overview>` (:issue:`41673`) - Added :meth:`MultiIndex.dtypes` (:issue:`37062`)
- Added
end
andend_day
options for theorigin
argument in :meth:`DataFrame.resample` (:issue:`37804`) - Improved error message when
usecols
andnames
do not match for :func:`read_csv` andengine="c"
(:issue:`29042`) - Improved consistency of error messages when passing an invalid
win_type
argument in :ref:`Window methods <api.window>` (:issue:`15969`) - :func:`read_sql_query` now accepts a
dtype
argument to cast the columnar data from the SQL database based on user input (:issue:`10285`) - :func:`read_csv` now raising
ParserWarning
if length of header or given names does not match length of data whenusecols
is not specified (:issue:`21768`) - Improved integer type mapping from pandas to SQLAlchemy when using :meth:`DataFrame.to_sql` (:issue:`35076`)
- :func:`to_numeric` now supports downcasting of nullable
ExtensionDtype
objects (:issue:`33013`) - Added support for dict-like names in :class:`MultiIndex.set_names` and :class:`MultiIndex.rename` (:issue:`20421`)
- :func:`read_excel` can now auto-detect .xlsb files and older .xls files (:issue:`35416`, :issue:`41225`)
- :class:`ExcelWriter` now accepts an
if_sheet_exists
parameter to control the behavior of append mode when writing to existing sheets (:issue:`40230`) - :meth:`.Rolling.sum`, :meth:`.Expanding.sum`, :meth:`.Rolling.mean`, :meth:`.Expanding.mean`, :meth:`.ExponentialMovingWindow.mean`, :meth:`.Rolling.median`, :meth:`.Expanding.median`, :meth:`.Rolling.max`, :meth:`.Expanding.max`, :meth:`.Rolling.min`, and :meth:`.Expanding.min` now support Numba execution with the
engine
keyword (:issue:`38895`, :issue:`41267`) - :meth:`DataFrame.apply` can now accept NumPy unary operators as strings, e.g.
df.apply("sqrt")
, which was already the case for :meth:`Series.apply` (:issue:`39116`) - :meth:`DataFrame.apply` can now accept non-callable DataFrame properties as strings, e.g.
df.apply("size")
, which was already the case for :meth:`Series.apply` (:issue:`39116`) - :meth:`DataFrame.applymap` can now accept kwargs to pass on to the user-provided
func
(:issue:`39987`) - Passing a :class:`DataFrame` indexer to
iloc
is now disallowed for :meth:`Series.__getitem__` and :meth:`DataFrame.__getitem__` (:issue:`39004`) - :meth:`Series.apply` can now accept list-like or dictionary-like arguments that aren't lists or dictionaries, e.g.
ser.apply(np.array(["sum", "mean"]))
, which was already the case for :meth:`DataFrame.apply` (:issue:`39140`) - :meth:`DataFrame.plot.scatter` can now accept a categorical column for the argument
c
(:issue:`12380`, :issue:`31357`) - :meth:`Series.loc` now raises a helpful error message when the Series has a :class:`MultiIndex` and the indexer has too many dimensions (:issue:`35349`)
- :func:`read_stata` now supports reading data from compressed files (:issue:`26599`)
- Added support for parsing
ISO 8601
-like timestamps with negative signs to :class:`Timedelta` (:issue:`37172`) - Added support for unary operators in :class:`FloatingArray` (:issue:`38749`)
- :class:`RangeIndex` can now be constructed by passing a
range
object directly e.g.pd.RangeIndex(range(3))
(:issue:`12067`) - :meth:`Series.round` and :meth:`DataFrame.round` now work with nullable integer and floating dtypes (:issue:`38844`)
- :meth:`read_csv` and :meth:`read_json` expose the argument
encoding_errors
to control how encoding errors are handled (:issue:`39450`) - :meth:`.DataFrameGroupBy.any`, :meth:`.SeriesGroupBy.any`, :meth:`.DataFrameGroupBy.all`, and :meth:`.SeriesGroupBy.all` use Kleene logic with nullable data types (:issue:`37506`)
- :meth:`.DataFrameGroupBy.any`, :meth:`.SeriesGroupBy.any`, :meth:`.DataFrameGroupBy.all`, and :meth:`.SeriesGroupBy.all` return a
BooleanDtype
for columns with nullable data types (:issue:`33449`) - :meth:`.DataFrameGroupBy.any`, :meth:`.SeriesGroupBy.any`, :meth:`.DataFrameGroupBy.all`, and :meth:`.SeriesGroupBy.all` raising with
object
data containingpd.NA
even whenskipna=True
(:issue:`37501`) - :meth:`.DataFrameGroupBy.rank` and :meth:`.SeriesGroupBy.rank` now supports object-dtype data (:issue:`38278`)
- Constructing a :class:`DataFrame` or :class:`Series` with the
data
argument being a Python iterable that is not a NumPyndarray
consisting of NumPy scalars will now result in a dtype with a precision the maximum of the NumPy scalars; this was already the case whendata
is a NumPyndarray
(:issue:`40908`) - Add keyword
sort
to :func:`pivot_table` to allow non-sorting of the result (:issue:`39143`) - Add keyword
dropna
to :meth:`DataFrame.value_counts` to allow counting rows that includeNA
values (:issue:`41325`) - :meth:`Series.replace` will now cast results to
PeriodDtype
where possible instead ofobject
dtype (:issue:`41526`) - Improved error message in
corr
andcov
methods on :class:`.Rolling`, :class:`.Expanding`, and :class:`.ExponentialMovingWindow` whenother
is not a :class:`DataFrame` or :class:`Series` (:issue:`41741`) - :meth:`Series.between` can now accept
left
orright
as arguments toinclusive
to include only the left or right boundary (:issue:`40245`) - :meth:`DataFrame.explode` now supports exploding multiple columns. Its
column
argument now also accepts a list of str or tuples for exploding on multiple columns at the same time (:issue:`39240`) - :meth:`DataFrame.sample` now accepts the
ignore_index
argument to reset the index after sampling, similar to :meth:`DataFrame.drop_duplicates` and :meth:`DataFrame.sort_values` (:issue:`38581`)
These are bug fixes that might have notable behavior changes.
Previously, when calling :meth:`Categorical.unique` with categorical data, unused categories in the new array would be removed, making the dtype of the new array different than the original (:issue:`18291`)
As an example of this, given:
.. ipython:: python dtype = pd.CategoricalDtype(['bad', 'neutral', 'good'], ordered=True) cat = pd.Categorical(['good', 'good', 'bad', 'bad'], dtype=dtype) original = pd.Series(cat) unique = original.unique()
Previous behavior:
In [1]: unique
['good', 'bad']
Categories (2, object): ['bad' < 'good']
In [2]: original.dtype == unique.dtype
False
New behavior:
.. ipython:: python unique original.dtype == unique.dtype
Preserve dtypes in :meth:`DataFrame.combine_first`
:meth:`DataFrame.combine_first` will now preserve dtypes (:issue:`7509`)
.. ipython:: python df1 = pd.DataFrame({"A": [1, 2, 3], "B": [1, 2, 3]}, index=[0, 1, 2]) df1 df2 = pd.DataFrame({"B": [4, 5, 6], "C": [1, 2, 3]}, index=[2, 3, 4]) df2 combined = df1.combine_first(df2)
Previous behavior:
In [1]: combined.dtypes
Out[2]:
A float64
B float64
C float64
dtype: object
New behavior:
.. ipython:: python combined.dtypes
Previously the methods :meth:`.DataFrameGroupBy.aggregate`,
:meth:`.SeriesGroupBy.aggregate`, :meth:`.DataFrameGroupBy.transform`, and
:meth:`.SeriesGroupBy.transform` might cast the result dtype when the argument func
is callable, possibly leading to undesirable results (:issue:`21240`). The cast would
occur if the result is numeric and casting back to the input dtype does not change any
values as measured by np.allclose
. Now no such casting occurs.
.. ipython:: python df = pd.DataFrame({'key': [1, 1], 'a': [True, False], 'b': [True, True]}) df
Previous behavior:
In [5]: df.groupby('key').agg(lambda x: x.sum())
Out[5]:
a b
key
1 True 2
New behavior:
.. ipython:: python df.groupby('key').agg(lambda x: x.sum())
float
result for :meth:`.DataFrameGroupBy.mean`, :meth:`.DataFrameGroupBy.median`, and :meth:`.GDataFrameGroupBy.var`, :meth:`.SeriesGroupBy.mean`, :meth:`.SeriesGroupBy.median`, and :meth:`.SeriesGroupBy.var`
Previously, these methods could result in different dtypes depending on the input values. Now, these methods will always return a float dtype. (:issue:`41137`)
.. ipython:: python df = pd.DataFrame({'a': [True], 'b': [1], 'c': [1.0]})
Previous behavior:
In [5]: df.groupby(df.index).mean()
Out[5]:
a b c
0 True 1 1.0
New behavior:
.. ipython:: python df.groupby(df.index).mean()
When setting an entire column using loc
or iloc
, pandas will try to
insert the values into the existing data rather than create an entirely new array.
.. ipython:: python df = pd.DataFrame(range(3), columns=["A"], dtype="float64") values = df.values new = np.array([5, 6, 7], dtype="int64") df.loc[[0, 1, 2], "A"] = new
In both the new and old behavior, the data in values
is overwritten, but in
the old behavior the dtype of df["A"]
changed to int64
.
Previous behavior:
In [1]: df.dtypes
Out[1]:
A int64
dtype: object
In [2]: np.shares_memory(df["A"].values, new)
Out[2]: False
In [3]: np.shares_memory(df["A"].values, values)
Out[3]: False
In pandas 1.3.0, df
continues to share data with values
New behavior:
.. ipython:: python df.dtypes np.shares_memory(df["A"], new) np.shares_memory(df["A"], values)
When setting multiple columns using frame[keys] = values
new arrays will
replace pre-existing arrays for these keys, which will not be over-written
(:issue:`39510`). As a result, the columns will retain the dtype(s) of values
,
never casting to the dtypes of the existing arrays.
.. ipython:: python df = pd.DataFrame(range(3), columns=["A"], dtype="float64") df[["A"]] = 5
In the old behavior, 5
was cast to float64
and inserted into the existing
array backing df
:
Previous behavior:
In [1]: df.dtypes
Out[1]:
A float64
In the new behavior, we get a new array, and retain an integer-dtyped 5
:
New behavior:
.. ipython:: python df.dtypes
Setting non-boolean values into a :class:`Series` with dtype=bool
now consistently
casts to dtype=object
(:issue:`38709`)
In [1]: orig = pd.Series([True, False])
In [2]: ser = orig.copy()
In [3]: ser.iloc[1] = np.nan
In [4]: ser2 = orig.copy()
In [5]: ser2.iloc[1] = 2.0
Previous behavior:
In [1]: ser
Out [1]:
0 1.0
1 NaN
dtype: float64
In [2]:ser2
Out [2]:
0 True
1 2.0
dtype: object
New behavior:
In [1]: ser
Out [1]:
0 True
1 NaN
dtype: object
In [2]:ser2
Out [2]:
0 True
1 2.0
dtype: object
The group-by column will now be dropped from the result of a
groupby.rolling
operation (:issue:`32262`)
.. ipython:: python df = pd.DataFrame({"A": [1, 1, 2, 3], "B": [0, 1, 2, 3]}) df
Previous behavior:
In [1]: df.groupby("A").rolling(2).sum()
Out[1]:
A B
A
1 0 NaN NaN
1 2.0 1.0
2 2 NaN NaN
3 3 NaN NaN
New behavior:
.. ipython:: python df.groupby("A").rolling(2).sum()
:meth:`.Rolling.std` and :meth:`.Rolling.var` will no longer
artificially truncate results that are less than ~1e-8
and ~1e-15
respectively to
zero (:issue:`37051`, :issue:`40448`, :issue:`39872`).
However, floating point artifacts may now exist in the results when rolling over larger values.
.. ipython:: python s = pd.Series([7, 5, 5, 5]) s.rolling(3).var()
DataFrameGroupBy.rolling and SeriesGroupBy.rolling with MultiIndex no longer drop levels in the result
:meth:`DataFrameGroupBy.rolling` and :meth:`SeriesGroupBy.rolling` will no longer drop levels of a :class:`DataFrame` with a :class:`MultiIndex` in the result. This can lead to a perceived duplication of levels in the resulting :class:`MultiIndex`, but this change restores the behavior that was present in version 1.1.3 (:issue:`38787`, :issue:`38523`).
.. ipython:: python index = pd.MultiIndex.from_tuples([('idx1', 'idx2')], names=['label1', 'label2']) df = pd.DataFrame({'a': [1], 'b': [2]}, index=index) df
Previous behavior:
In [1]: df.groupby('label1').rolling(1).sum()
Out[1]:
a b
label1
idx1 1.0 2.0
New behavior:
.. ipython:: python df.groupby('label1').rolling(1).sum()
Some minimum supported versions of dependencies were updated. If installed, we now require:
Package | Minimum Version | Required | Changed |
---|---|---|---|
numpy | 1.17.3 | X | X |
pytz | 2017.3 | X | |
python-dateutil | 2.7.3 | X | |
bottleneck | 1.2.1 | ||
numexpr | 2.7.0 | X | |
pytest (dev) | 6.0 | X | |
mypy (dev) | 0.812 | X | |
setuptools | 38.6.0 | 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 |
---|---|---|
beautifulsoup4 | 4.6.0 | |
fastparquet | 0.4.0 | X |
fsspec | 0.7.4 | |
gcsfs | 0.6.0 | |
lxml | 4.3.0 | |
matplotlib | 2.2.3 | |
numba | 0.46.0 | |
openpyxl | 3.0.0 | X |
pyarrow | 0.17.0 | X |
pymysql | 0.8.1 | X |
pytables | 3.5.1 | |
s3fs | 0.4.0 | |
scipy | 1.2.0 | |
sqlalchemy | 1.3.0 | X |
tabulate | 0.8.7 | X |
xarray | 0.12.0 | |
xlrd | 1.2.0 | |
xlsxwriter | 1.0.2 | |
xlwt | 1.3.0 | |
pandas-gbq | 0.12.0 |
See :ref:`install.dependencies` and :ref:`install.optional_dependencies` for more.
- Partially initialized :class:`CategoricalDtype` objects (i.e. those with
categories=None
) will no longer compare as equal to fully initialized dtype objects (:issue:`38516`) - Accessing
_constructor_expanddim
on a :class:`DataFrame` and_constructor_sliced
on a :class:`Series` now raise anAttributeError
. Previously aNotImplementedError
was raised (:issue:`38782`) - Added new
engine
and**engine_kwargs
parameters to :meth:`DataFrame.to_sql` to support other future "SQL engines". Currently we still only useSQLAlchemy
under the hood, but more engines are planned to be supported such as turbodbc (:issue:`36893`) - Removed redundant
freq
from :class:`PeriodIndex` string representation (:issue:`41653`) - :meth:`ExtensionDtype.construct_array_type` is now a required method instead of an optional one for :class:`ExtensionDtype` subclasses (:issue:`24860`)
- Calling
hash
on non-hashable pandas objects will now raiseTypeError
with the built-in error message (e.g.unhashable type: 'Series'
). Previously it would raise a custom message such as'Series' objects are mutable, thus they cannot be hashed
. Furthermore,isinstance(<Series>, abc.collections.Hashable)
will now returnFalse
(:issue:`40013`) - :meth:`.Styler.from_custom_template` now has two new arguments for template names, and removed the old
name
, due to template inheritance having been introducing for better parsing (:issue:`42053`). Subclassing modifications to Styler attributes are also needed.
- Documentation in
.pptx
and.pdf
formats are no longer included in wheels or source distributions. (:issue:`30741`)
Calling a reduction (e.g. .min
, .max
, .sum
) on a :class:`DataFrame` with
numeric_only=None
(the default), columns where the reduction raises a TypeError
are silently ignored and dropped from the result.
This behavior is deprecated. In a future version, the TypeError
will be raised,
and users will need to select only valid columns before calling the function.
For example:
.. ipython:: python df = pd.DataFrame({"A": [1, 2, 3, 4], "B": pd.date_range("2016-01-01", periods=4)}) df
Old behavior:
In [3]: df.prod()
Out[3]:
Out[3]:
A 24
dtype: int64
Future behavior:
In [4]: df.prod()
...
TypeError: 'DatetimeArray' does not implement reduction 'prod'
In [5]: df[["A"]].prod()
Out[5]:
A 24
dtype: int64
Similarly, when applying a function to :class:`DataFrameGroupBy`, columns on which
the function raises TypeError
are currently silently ignored and dropped
from the result.
This behavior is deprecated. In a future version, the TypeError
will be raised, and users will need to select only valid columns before calling
the function.
For example:
.. ipython:: python df = pd.DataFrame({"A": [1, 2, 3, 4], "B": pd.date_range("2016-01-01", periods=4)}) gb = df.groupby([1, 1, 2, 2])
Old behavior:
In [4]: gb.prod(numeric_only=False)
Out[4]:
A
1 2
2 12
Future behavior:
In [5]: gb.prod(numeric_only=False)
...
TypeError: datetime64 type does not support prod operations
In [6]: gb[["A"]].prod(numeric_only=False)
Out[6]:
A
1 2
2 12
- Deprecated allowing scalars to be passed to the :class:`Categorical` constructor (:issue:`38433`)
- Deprecated constructing :class:`CategoricalIndex` without passing list-like data (:issue:`38944`)
- Deprecated allowing subclass-specific keyword arguments in the :class:`Index` constructor, use the specific subclass directly instead (:issue:`14093`, :issue:`21311`, :issue:`22315`, :issue:`26974`)
- Deprecated the :meth:`astype` method of datetimelike (
timedelta64[ns]
,datetime64[ns]
,Datetime64TZDtype
,PeriodDtype
) to convert to integer dtypes, usevalues.view(...)
instead (:issue:`38544`). This deprecation was later reverted in pandas 1.4.0. - Deprecated :meth:`MultiIndex.is_lexsorted` and :meth:`MultiIndex.lexsort_depth`, use :meth:`MultiIndex.is_monotonic_increasing` instead (:issue:`32259`)
- Deprecated keyword
try_cast
in :meth:`Series.where`, :meth:`Series.mask`, :meth:`DataFrame.where`, :meth:`DataFrame.mask`; cast results manually if desired (:issue:`38836`) - Deprecated comparison of :class:`Timestamp` objects with
datetime.date
objects. Instead of e.g.ts <= mydate
usets <= pd.Timestamp(mydate)
orts.date() <= mydate
(:issue:`36131`) - Deprecated :attr:`Rolling.win_type` returning
"freq"
(:issue:`38963`) - Deprecated :attr:`Rolling.is_datetimelike` (:issue:`38963`)
- Deprecated :class:`DataFrame` indexer for :meth:`Series.__setitem__` and :meth:`DataFrame.__setitem__` (:issue:`39004`)
- Deprecated :meth:`ExponentialMovingWindow.vol` (:issue:`39220`)
- Using
.astype
to convert betweendatetime64[ns]
dtype and :class:`DatetimeTZDtype` is deprecated and will raise in a future version, useobj.tz_localize
orobj.dt.tz_localize
instead (:issue:`38622`) - Deprecated casting
datetime.date
objects todatetime64
when used asfill_value
in :meth:`DataFrame.unstack`, :meth:`DataFrame.shift`, :meth:`Series.shift`, and :meth:`DataFrame.reindex`, passpd.Timestamp(dateobj)
instead (:issue:`39767`) - Deprecated :meth:`.Styler.set_na_rep` and :meth:`.Styler.set_precision` in favor of :meth:`.Styler.format` with
na_rep
andprecision
as existing and new input arguments respectively (:issue:`40134`, :issue:`40425`) - Deprecated :meth:`.Styler.where` in favor of using an alternative formulation with :meth:`Styler.applymap` (:issue:`40821`)
- Deprecated allowing partial failure in :meth:`Series.transform` and :meth:`DataFrame.transform` when
func
is list-like or dict-like and raises anything butTypeError
;func
raising anything but aTypeError
will raise in a future version (:issue:`40211`) - Deprecated arguments
error_bad_lines
andwarn_bad_lines
in :meth:`read_csv` and :meth:`read_table` in favor of argumenton_bad_lines
(:issue:`15122`) - Deprecated support for
np.ma.mrecords.MaskedRecords
in the :class:`DataFrame` constructor, pass{name: data[name] for name in data.dtype.names}
instead (:issue:`40363`) - Deprecated using :func:`merge`, :meth:`DataFrame.merge`, and :meth:`DataFrame.join` on a different number of levels (:issue:`34862`)
- Deprecated the use of
**kwargs
in :class:`.ExcelWriter`; use the keyword argumentengine_kwargs
instead (:issue:`40430`) - Deprecated the
level
keyword for :class:`DataFrame` and :class:`Series` aggregations; use groupby instead (:issue:`39983`) - Deprecated the
inplace
parameter of :meth:`Categorical.remove_categories`, :meth:`Categorical.add_categories`, :meth:`Categorical.reorder_categories`, :meth:`Categorical.rename_categories`, :meth:`Categorical.set_categories` and will be removed in a future version (:issue:`37643`) - Deprecated :func:`merge` producing duplicated columns through the
suffixes
keyword and already existing columns (:issue:`22818`) - Deprecated setting :attr:`Categorical._codes`, create a new :class:`Categorical` with the desired codes instead (:issue:`40606`)
- Deprecated the
convert_float
optional argument in :func:`read_excel` and :meth:`ExcelFile.parse` (:issue:`41127`) - Deprecated behavior of :meth:`DatetimeIndex.union` with mixed timezones; in a future version both will be cast to UTC instead of object dtype (:issue:`39328`)
- Deprecated using
usecols
with out of bounds indices for :func:`read_csv` withengine="c"
(:issue:`25623`) - Deprecated special treatment of lists with first element a Categorical in the :class:`DataFrame` constructor; pass as
pd.DataFrame({col: categorical, ...})
instead (:issue:`38845`) - Deprecated behavior of :class:`DataFrame` constructor when a
dtype
is passed and the data cannot be cast to that dtype. In a future version, this will raise instead of being silently ignored (:issue:`24435`) - Deprecated the :attr:`Timestamp.freq` attribute. For the properties that use it (
is_month_start
,is_month_end
,is_quarter_start
,is_quarter_end
,is_year_start
,is_year_end
), when you have afreq
, use e.g.freq.is_month_start(ts)
(:issue:`15146`) - Deprecated construction of :class:`Series` or :class:`DataFrame` with
DatetimeTZDtype
data anddatetime64[ns]
dtype. UseSeries(data).dt.tz_localize(None)
instead (:issue:`41555`, :issue:`33401`) - Deprecated behavior of :class:`Series` construction with large-integer values and small-integer dtype silently overflowing; use
Series(data).astype(dtype)
instead (:issue:`41734`) - Deprecated behavior of :class:`DataFrame` construction with floating data and integer dtype casting even when lossy; in a future version this will remain floating, matching :class:`Series` behavior (:issue:`41770`)
- Deprecated inference of
timedelta64[ns]
,datetime64[ns]
, orDatetimeTZDtype
dtypes in :class:`Series` construction when data containing strings is passed and nodtype
is passed (:issue:`33558`) - In a future version, constructing :class:`Series` or :class:`DataFrame` with
datetime64[ns]
data andDatetimeTZDtype
will treat the data as wall-times instead of as UTC times (matching DatetimeIndex behavior). To treat the data as UTC times, usepd.Series(data).dt.tz_localize("UTC").dt.tz_convert(dtype.tz)
orpd.Series(data.view("int64"), dtype=dtype)
(:issue:`33401`) - Deprecated passing lists as
key
to :meth:`DataFrame.xs` and :meth:`Series.xs` (:issue:`41760`) - Deprecated boolean arguments of
inclusive
in :meth:`Series.between` to have{"left", "right", "neither", "both"}
as standard argument values (:issue:`40628`) - Deprecated passing arguments as positional for all of the following, with exceptions noted (:issue:`41485`):
- :func:`concat` (other than
objs
) - :func:`read_csv` (other than
filepath_or_buffer
) - :func:`read_table` (other than
filepath_or_buffer
) - :meth:`DataFrame.clip` and :meth:`Series.clip` (other than
upper
andlower
) - :meth:`DataFrame.drop_duplicates` (except for
subset
), :meth:`Series.drop_duplicates`, :meth:`Index.drop_duplicates` and :meth:`MultiIndex.drop_duplicates` - :meth:`DataFrame.drop` (other than
labels
) and :meth:`Series.drop` - :meth:`DataFrame.dropna` and :meth:`Series.dropna`
- :meth:`DataFrame.ffill`, :meth:`Series.ffill`, :meth:`DataFrame.bfill`, and :meth:`Series.bfill`
- :meth:`DataFrame.fillna` and :meth:`Series.fillna` (apart from
value
) - :meth:`DataFrame.interpolate` and :meth:`Series.interpolate` (other than
method
) - :meth:`DataFrame.mask` and :meth:`Series.mask` (other than
cond
andother
) - :meth:`DataFrame.reset_index` (other than
level
) and :meth:`Series.reset_index` - :meth:`DataFrame.set_axis` and :meth:`Series.set_axis` (other than
labels
) - :meth:`DataFrame.set_index` (other than
keys
) - :meth:`DataFrame.sort_index` and :meth:`Series.sort_index`
- :meth:`DataFrame.sort_values` (other than
by
) and :meth:`Series.sort_values` - :meth:`DataFrame.where` and :meth:`Series.where` (other than
cond
andother
) - :meth:`Index.set_names` and :meth:`MultiIndex.set_names` (except for
names
) - :meth:`MultiIndex.codes` (except for
codes
) - :meth:`MultiIndex.set_levels` (except for
levels
) - :meth:`Resampler.interpolate` (other than
method
)
- :func:`concat` (other than
- Performance improvement in :meth:`IntervalIndex.isin` (:issue:`38353`)
- Performance improvement in :meth:`Series.mean` for nullable data types (:issue:`34814`)
- Performance improvement in :meth:`Series.isin` for nullable data types (:issue:`38340`)
- Performance improvement in :meth:`DataFrame.fillna` with
method="pad"
ormethod="backfill"
for nullable floating and nullable integer dtypes (:issue:`39953`) - Performance improvement in :meth:`DataFrame.corr` for
method=kendall
(:issue:`28329`) - Performance improvement in :meth:`DataFrame.corr` for
method=spearman
(:issue:`40956`, :issue:`41885`) - Performance improvement in :meth:`.Rolling.corr` and :meth:`.Rolling.cov` (:issue:`39388`)
- Performance improvement in :meth:`.RollingGroupby.corr`, :meth:`.ExpandingGroupby.corr`, :meth:`.ExpandingGroupby.corr` and :meth:`.ExpandingGroupby.cov` (:issue:`39591`)
- Performance improvement in :func:`unique` for object data type (:issue:`37615`)
- Performance improvement in :func:`json_normalize` for basic cases (including separators) (:issue:`40035` :issue:`15621`)
- Performance improvement in :class:`.ExpandingGroupby` aggregation methods (:issue:`39664`)
- Performance improvement in :class:`.Styler` where render times are more than 50% reduced and now matches :meth:`DataFrame.to_html` (:issue:`39972` :issue:`39952`, :issue:`40425`)
- The method :meth:`.Styler.set_td_classes` is now as performant as :meth:`.Styler.apply` and :meth:`.Styler.applymap`, and even more so in some cases (:issue:`40453`)
- Performance improvement in :meth:`.ExponentialMovingWindow.mean` with
times
(:issue:`39784`) - Performance improvement in :meth:`.DataFrameGroupBy.apply` and :meth:`.SeriesGroupBy.apply` when requiring the Python fallback implementation (:issue:`40176`)
- Performance improvement in the conversion of a PyArrow Boolean array to a pandas nullable Boolean array (:issue:`41051`)
- Performance improvement for concatenation of data with type :class:`CategoricalDtype` (:issue:`40193`)
- Performance improvement in :meth:`.DataFrameGroupBy.cummin`, :meth:`.SeriesGroupBy.cummin`, :meth:`.DataFrameGroupBy.cummax`, and :meth:`.SeriesGroupBy.cummax` with nullable data types (:issue:`37493`)
- Performance improvement in :meth:`Series.nunique` with nan values (:issue:`40865`)
- Performance improvement in :meth:`DataFrame.transpose`, :meth:`Series.unstack` with
DatetimeTZDtype
(:issue:`40149`) - Performance improvement in :meth:`Series.plot` and :meth:`DataFrame.plot` with entry point lazy loading (:issue:`41492`)
- Bug in :class:`CategoricalIndex` incorrectly failing to raise
TypeError
when scalar data is passed (:issue:`38614`) - Bug in
CategoricalIndex.reindex
failed when the :class:`Index` passed was not categorical but whose values were all labels in the category (:issue:`28690`) - Bug where constructing a :class:`Categorical` from an object-dtype array of
date
objects did not round-trip correctly withastype
(:issue:`38552`) - Bug in constructing a :class:`DataFrame` from an
ndarray
and a :class:`CategoricalDtype` (:issue:`38857`) - Bug in setting categorical values into an object-dtype column in a :class:`DataFrame` (:issue:`39136`)
- Bug in :meth:`DataFrame.reindex` was raising an
IndexError
when the new index contained duplicates and the old index was a :class:`CategoricalIndex` (:issue:`38906`) - Bug in :meth:`Categorical.fillna` with a tuple-like category raising
NotImplementedError
instead ofValueError
when filling with a non-category tuple (:issue:`41914`)
- Bug in :class:`DataFrame` and :class:`Series` constructors sometimes dropping nanoseconds from :class:`Timestamp` (resp. :class:`Timedelta`)
data
, withdtype=datetime64[ns]
(resp.timedelta64[ns]
) (:issue:`38032`) - Bug in :meth:`DataFrame.first` and :meth:`Series.first` with an offset of one month returning an incorrect result when the first day is the last day of a month (:issue:`29623`)
- Bug in constructing a :class:`DataFrame` or :class:`Series` with mismatched
datetime64
data andtimedelta64
dtype, or vice-versa, failing to raise aTypeError
(:issue:`38575`, :issue:`38764`, :issue:`38792`) - Bug in constructing a :class:`Series` or :class:`DataFrame` with a
datetime
object out of bounds fordatetime64[ns]
dtype or atimedelta
object out of bounds fortimedelta64[ns]
dtype (:issue:`38792`, :issue:`38965`) - Bug in :meth:`DatetimeIndex.intersection`, :meth:`DatetimeIndex.symmetric_difference`, :meth:`PeriodIndex.intersection`, :meth:`PeriodIndex.symmetric_difference` always returning object-dtype when operating with :class:`CategoricalIndex` (:issue:`38741`)
- Bug in :meth:`DatetimeIndex.intersection` giving incorrect results with non-Tick frequencies with
n != 1
(:issue:`42104`) - Bug in :meth:`Series.where` incorrectly casting
datetime64
values toint64
(:issue:`37682`) - Bug in :class:`Categorical` incorrectly typecasting
datetime
object toTimestamp
(:issue:`38878`) - Bug in comparisons between :class:`Timestamp` object and
datetime64
objects just outside the implementation bounds for nanoseconddatetime64
(:issue:`39221`) - Bug in :meth:`Timestamp.round`, :meth:`Timestamp.floor`, :meth:`Timestamp.ceil` for values near the implementation bounds of :class:`Timestamp` (:issue:`39244`)
- Bug in :meth:`Timedelta.round`, :meth:`Timedelta.floor`, :meth:`Timedelta.ceil` for values near the implementation bounds of :class:`Timedelta` (:issue:`38964`)
- Bug in :func:`date_range` incorrectly creating :class:`DatetimeIndex` containing
NaT
instead of raisingOutOfBoundsDatetime
in corner cases (:issue:`24124`) - Bug in :func:`infer_freq` incorrectly fails to infer 'H' frequency of :class:`DatetimeIndex` if the latter has a timezone and crosses DST boundaries (:issue:`39556`)
- Bug in :class:`Series` backed by :class:`DatetimeArray` or :class:`TimedeltaArray` sometimes failing to set the array's
freq
toNone
(:issue:`41425`)
- Bug in constructing :class:`Timedelta` from
np.timedelta64
objects with non-nanosecond units that are out of bounds fortimedelta64[ns]
(:issue:`38965`) - Bug in constructing a :class:`TimedeltaIndex` incorrectly accepting
np.datetime64("NaT")
objects (:issue:`39462`) - Bug in constructing :class:`Timedelta` from an input string with only symbols and no digits failed to raise an error (:issue:`39710`)
- Bug in :class:`TimedeltaIndex` and :func:`to_timedelta` failing to raise when passed non-nanosecond
timedelta64
arrays that overflow when converting totimedelta64[ns]
(:issue:`40008`)
- Bug in different
tzinfo
objects representing UTC not being treated as equivalent (:issue:`39216`) - Bug in
dateutil.tz.gettz("UTC")
not being recognized as equivalent to other UTC-representing tzinfos (:issue:`39276`)
- Bug in :meth:`DataFrame.quantile`, :meth:`DataFrame.sort_values` causing incorrect subsequent indexing behavior (:issue:`38351`)
- Bug in :meth:`DataFrame.sort_values` raising an :class:`IndexError` for empty
by
(:issue:`40258`) - Bug in :meth:`DataFrame.select_dtypes` with
include=np.number
would drop numericExtensionDtype
columns (:issue:`35340`) - Bug in :meth:`DataFrame.mode` and :meth:`Series.mode` not keeping consistent integer :class:`Index` for empty input (:issue:`33321`)
- Bug in :meth:`DataFrame.rank` when the DataFrame contained
np.inf
(:issue:`32593`) - Bug in :meth:`DataFrame.rank` with
axis=0
and columns holding incomparable types raising anIndexError
(:issue:`38932`) - Bug in :meth:`Series.rank`, :meth:`DataFrame.rank`, :meth:`.DataFrameGroupBy.rank`, and :meth:`.SeriesGroupBy.rank` treating the most negative
int64
value as missing (:issue:`32859`) - Bug in :meth:`DataFrame.select_dtypes` different behavior between Windows and Linux with
include="int"
(:issue:`36596`) - Bug in :meth:`DataFrame.apply` and :meth:`DataFrame.agg` when passed the argument
func="size"
would operate on the entireDataFrame
instead of rows or columns (:issue:`39934`) - Bug in :meth:`DataFrame.transform` would raise a
SpecificationError
when passed a dictionary and columns were missing; will now raise aKeyError
instead (:issue:`40004`) - Bug in :meth:`.DataFrameGroupBy.rank` and :meth:`.SeriesGroupBy.rank` giving incorrect results with
pct=True
and equal values between consecutive groups (:issue:`40518`) - Bug in :meth:`Series.count` would result in an
int32
result on 32-bit platforms when argumentlevel=None
(:issue:`40908`) - Bug in :class:`Series` and :class:`DataFrame` reductions with methods
any
andall
not returning Boolean results for object data (:issue:`12863`, :issue:`35450`, :issue:`27709`) - Bug in :meth:`Series.clip` would fail if the Series contains NA values and has nullable int or float as a data type (:issue:`40851`)
- Bug in :meth:`UInt64Index.where` and :meth:`UInt64Index.putmask` with an
np.int64
dtypeother
incorrectly raisingTypeError
(:issue:`41974`) - Bug in :meth:`DataFrame.agg` not sorting the aggregated axis in the order of the provided aggregation functions when one or more aggregation function fails to produce results (:issue:`33634`)
- Bug in :meth:`DataFrame.clip` not interpreting missing values as no threshold (:issue:`40420`)
- Bug in :meth:`Series.to_dict` with
orient='records'
now returns Python native types (:issue:`25969`) - Bug in :meth:`Series.view` and :meth:`Index.view` when converting between datetime-like (
datetime64[ns]
,datetime64[ns, tz]
,timedelta64
,period
) dtypes (:issue:`39788`) - Bug in creating a :class:`DataFrame` from an empty
np.recarray
not retaining the original dtypes (:issue:`40121`) - Bug in :class:`DataFrame` failing to raise a
TypeError
when constructing from afrozenset
(:issue:`40163`) - Bug in :class:`Index` construction silently ignoring a passed
dtype
when the data cannot be cast to that dtype (:issue:`21311`) - Bug in :meth:`StringArray.astype` falling back to NumPy and raising when converting to
dtype='categorical'
(:issue:`40450`) - Bug in :func:`factorize` where, when given an array with a numeric NumPy dtype lower than int64, uint64 and float64, the unique values did not keep their original dtype (:issue:`41132`)
- Bug in :class:`DataFrame` construction with a dictionary containing an array-like with
ExtensionDtype
andcopy=True
failing to make a copy (:issue:`38939`) - Bug in :meth:`qcut` raising error when taking
Float64DType
as input (:issue:`40730`) - Bug in :class:`DataFrame` and :class:`Series` construction with
datetime64[ns]
data anddtype=object
resulting indatetime
objects instead of :class:`Timestamp` objects (:issue:`41599`) - Bug in :class:`DataFrame` and :class:`Series` construction with
timedelta64[ns]
data anddtype=object
resulting innp.timedelta64
objects instead of :class:`Timedelta` objects (:issue:`41599`) - Bug in :class:`DataFrame` construction when given a two-dimensional object-dtype
np.ndarray
of :class:`Period` or :class:`Interval` objects failing to cast to :class:`PeriodDtype` or :class:`IntervalDtype`, respectively (:issue:`41812`) - Bug in constructing a :class:`Series` from a list and a :class:`PandasDtype` (:issue:`39357`)
- Bug in creating a :class:`Series` from a
range
object that does not fit in the bounds ofint64
dtype (:issue:`30173`) - Bug in creating a :class:`Series` from a
dict
with all-tuple keys and an :class:`Index` that requires reindexing (:issue:`41707`) - Bug in :func:`.infer_dtype` not recognizing Series, Index, or array with a Period dtype (:issue:`23553`)
- Bug in :func:`.infer_dtype` raising an error for general :class:`.ExtensionArray` objects. It will now return
"unknown-array"
instead of raising (:issue:`37367`) - Bug in :meth:`DataFrame.convert_dtypes` incorrectly raised a
ValueError
when called on an empty DataFrame (:issue:`40393`)
- Bug in the conversion from
pyarrow.ChunkedArray
to :class:`~arrays.StringArray` when the original had zero chunks (:issue:`41040`) - Bug in :meth:`Series.replace` and :meth:`DataFrame.replace` ignoring replacements with
regex=True
forStringDType
data (:issue:`41333`, :issue:`35977`) - Bug in :meth:`Series.str.extract` with :class:`~arrays.StringArray` returning object dtype for an empty :class:`DataFrame` (:issue:`41441`)
- Bug in :meth:`Series.str.replace` where the
case
argument was ignored whenregex=False
(:issue:`41602`)
- Bug in :meth:`IntervalIndex.intersection` and :meth:`IntervalIndex.symmetric_difference` always returning object-dtype when operating with :class:`CategoricalIndex` (:issue:`38653`, :issue:`38741`)
- Bug in :meth:`IntervalIndex.intersection` returning duplicates when at least one of the :class:`Index` objects have duplicates which are present in the other (:issue:`38743`)
- :meth:`IntervalIndex.union`, :meth:`IntervalIndex.intersection`, :meth:`IntervalIndex.difference`, and :meth:`IntervalIndex.symmetric_difference` now cast to the appropriate dtype instead of raising a
TypeError
when operating with another :class:`IntervalIndex` with incompatible dtype (:issue:`39267`) - :meth:`PeriodIndex.union`, :meth:`PeriodIndex.intersection`, :meth:`PeriodIndex.symmetric_difference`, :meth:`PeriodIndex.difference` now cast to object dtype instead of raising
IncompatibleFrequency
when operating with another :class:`PeriodIndex` with incompatible dtype (:issue:`39306`) - Bug in :meth:`IntervalIndex.is_monotonic`, :meth:`IntervalIndex.get_loc`, :meth:`IntervalIndex.get_indexer_for`, and :meth:`IntervalIndex.__contains__` when NA values are present (:issue:`41831`)
- Bug in :meth:`Index.union` and :meth:`MultiIndex.union` dropping duplicate
Index
values whenIndex
was not monotonic orsort
was set toFalse
(:issue:`36289`, :issue:`31326`, :issue:`40862`) - Bug in :meth:`CategoricalIndex.get_indexer` failing to raise
InvalidIndexError
when non-unique (:issue:`38372`) - Bug in :meth:`IntervalIndex.get_indexer` when
target
hasCategoricalDtype
and both the index and the target contain NA values (:issue:`41934`) - Bug in :meth:`Series.loc` raising a
ValueError
when input was filtered with a Boolean list and values to set were a list with lower dimension (:issue:`20438`) - Bug in inserting many new columns into a :class:`DataFrame` causing incorrect subsequent indexing behavior (:issue:`38380`)
- Bug in :meth:`DataFrame.__setitem__` raising a
ValueError
when setting multiple values to duplicate columns (:issue:`15695`) - Bug in :meth:`DataFrame.loc`, :meth:`Series.loc`, :meth:`DataFrame.__getitem__` and :meth:`Series.__getitem__` returning incorrect elements for non-monotonic :class:`DatetimeIndex` for string slices (:issue:`33146`)
- Bug in :meth:`DataFrame.reindex` and :meth:`Series.reindex` with timezone aware indexes raising a
TypeError
formethod="ffill"
andmethod="bfill"
and specifiedtolerance
(:issue:`38566`) - Bug in :meth:`DataFrame.reindex` with
datetime64[ns]
ortimedelta64[ns]
incorrectly casting to integers when thefill_value
requires casting to object dtype (:issue:`39755`) - Bug in :meth:`DataFrame.__setitem__` raising a
ValueError
when setting on an empty :class:`DataFrame` using specified columns and a nonempty :class:`DataFrame` value (:issue:`38831`) - Bug in :meth:`DataFrame.loc.__setitem__` raising a
ValueError
when operating on a unique column when the :class:`DataFrame` has duplicate columns (:issue:`38521`) - Bug in :meth:`DataFrame.iloc.__setitem__` and :meth:`DataFrame.loc.__setitem__` with mixed dtypes when setting with a dictionary value (:issue:`38335`)
- Bug in :meth:`Series.loc.__setitem__` and :meth:`DataFrame.loc.__setitem__` raising
KeyError
when provided a Boolean generator (:issue:`39614`) - Bug in :meth:`Series.iloc` and :meth:`DataFrame.iloc` raising a
KeyError
when provided a generator (:issue:`39614`) - Bug in :meth:`DataFrame.__setitem__` not raising a
ValueError
when the right hand side is a :class:`DataFrame` with wrong number of columns (:issue:`38604`) - Bug in :meth:`Series.__setitem__` raising a
ValueError
when setting a :class:`Series` with a scalar indexer (:issue:`38303`) - Bug in :meth:`DataFrame.loc` dropping levels of a :class:`MultiIndex` when the :class:`DataFrame` used as input has only one row (:issue:`10521`)
- Bug in :meth:`DataFrame.__getitem__` and :meth:`Series.__getitem__` always raising
KeyError
when slicing with existing strings where the :class:`Index` has milliseconds (:issue:`33589`) - Bug in setting
timedelta64
ordatetime64
values into numeric :class:`Series` failing to cast to object dtype (:issue:`39086`, :issue:`39619`) - Bug in setting :class:`Interval` values into a :class:`Series` or :class:`DataFrame` with mismatched :class:`IntervalDtype` incorrectly casting the new values to the existing dtype (:issue:`39120`)
- Bug in setting
datetime64
values into a :class:`Series` with integer-dtype incorrectly casting the datetime64 values to integers (:issue:`39266`) - Bug in setting
np.datetime64("NaT")
into a :class:`Series` with :class:`Datetime64TZDtype` incorrectly treating the timezone-naive value as timezone-aware (:issue:`39769`) - Bug in :meth:`Index.get_loc` not raising
KeyError
whenkey=NaN
andmethod
is specified butNaN
is not in the :class:`Index` (:issue:`39382`) - Bug in :meth:`DatetimeIndex.insert` when inserting
np.datetime64("NaT")
into a timezone-aware index incorrectly treating the timezone-naive value as timezone-aware (:issue:`39769`) - Bug in incorrectly raising in :meth:`Index.insert`, when setting a new column that cannot be held in the existing
frame.columns
, or in :meth:`Series.reset_index` or :meth:`DataFrame.reset_index` instead of casting to a compatible dtype (:issue:`39068`) - Bug in :meth:`RangeIndex.append` where a single object of length 1 was concatenated incorrectly (:issue:`39401`)
- Bug in :meth:`RangeIndex.astype` where when converting to :class:`CategoricalIndex`, the categories became a :class:`Int64Index` instead of a :class:`RangeIndex` (:issue:`41263`)
- Bug in setting
numpy.timedelta64
values into an object-dtype :class:`Series` using a Boolean indexer (:issue:`39488`) - Bug in setting numeric values into a into a boolean-dtypes :class:`Series` using
at
oriat
failing to cast to object-dtype (:issue:`39582`) - Bug in :meth:`DataFrame.__setitem__` and :meth:`DataFrame.iloc.__setitem__` raising
ValueError
when trying to index with a row-slice and setting a list as values (:issue:`40440`) - Bug in :meth:`DataFrame.loc` not raising
KeyError
when the key was not found in :class:`MultiIndex` and the levels were not fully specified (:issue:`41170`) - Bug in :meth:`DataFrame.loc.__setitem__` when setting-with-expansion incorrectly raising when the index in the expanding axis contained duplicates (:issue:`40096`)
- Bug in :meth:`DataFrame.loc.__getitem__` with :class:`MultiIndex` casting to float when at least one index column has float dtype and we retrieve a scalar (:issue:`41369`)
- Bug in :meth:`DataFrame.loc` incorrectly matching non-Boolean index elements (:issue:`20432`)
- Bug in indexing with
np.nan
on a :class:`Series` or :class:`DataFrame` with a :class:`CategoricalIndex` incorrectly raisingKeyError
whennp.nan
keys are present (:issue:`41933`) - Bug in :meth:`Series.__delitem__` with
ExtensionDtype
incorrectly casting tondarray
(:issue:`40386`) - Bug in :meth:`DataFrame.at` with a :class:`CategoricalIndex` returning incorrect results when passed integer keys (:issue:`41846`)
- Bug in :meth:`DataFrame.loc` returning a :class:`MultiIndex` in the wrong order if an indexer has duplicates (:issue:`40978`)
- Bug in :meth:`DataFrame.__setitem__` raising a
TypeError
when using astr
subclass as the column name with a :class:`DatetimeIndex` (:issue:`37366`) - Bug in :meth:`PeriodIndex.get_loc` failing to raise a
KeyError
when given a :class:`Period` with a mismatchedfreq
(:issue:`41670`) - Bug
.loc.__getitem__
with a :class:`UInt64Index` and negative-integer keys raisingOverflowError
instead ofKeyError
in some cases, wrapping around to positive integers in others (:issue:`41777`) - Bug in :meth:`Index.get_indexer` failing to raise
ValueError
in some cases with invalidmethod
,limit
, ortolerance
arguments (:issue:`41918`) - Bug when slicing a :class:`Series` or :class:`DataFrame` with a :class:`TimedeltaIndex` when passing an invalid string raising
ValueError
instead of aTypeError
(:issue:`41821`) - Bug in :class:`Index` constructor sometimes silently ignoring a specified
dtype
(:issue:`38879`) - :meth:`Index.where` behavior now mirrors :meth:`Index.putmask` behavior, i.e.
index.where(mask, other)
matchesindex.putmask(~mask, other)
(:issue:`39412`)
- Bug in :class:`Grouper` did not correctly propagate the
dropna
argument; :meth:`.DataFrameGroupBy.transform` now correctly handles missing values fordropna=True
(:issue:`35612`) - Bug in :func:`isna`, :meth:`Series.isna`, :meth:`Index.isna`, :meth:`DataFrame.isna`, and the corresponding
notna
functions not recognizingDecimal("NaN")
objects (:issue:`39409`) - Bug in :meth:`DataFrame.fillna` not accepting a dictionary for the
downcast
keyword (:issue:`40809`) - Bug in :func:`isna` not returning a copy of the mask for nullable types, causing any subsequent mask modification to change the original array (:issue:`40935`)
- Bug in :class:`DataFrame` construction with float data containing
NaN
and an integerdtype
casting instead of retaining theNaN
(:issue:`26919`) - Bug in :meth:`Series.isin` and :meth:`MultiIndex.isin` didn't treat all nans as equivalent if they were in tuples (:issue:`41836`)
- Bug in :meth:`DataFrame.drop` raising a
TypeError
when the :class:`MultiIndex` is non-unique andlevel
is not provided (:issue:`36293`) - Bug in :meth:`MultiIndex.intersection` duplicating
NaN
in the result (:issue:`38623`) - Bug in :meth:`MultiIndex.equals` incorrectly returning
True
when the :class:`MultiIndex` containedNaN
even when they are differently ordered (:issue:`38439`) - Bug in :meth:`MultiIndex.intersection` always returning an empty result when intersecting with :class:`CategoricalIndex` (:issue:`38653`)
- Bug in :meth:`MultiIndex.difference` incorrectly raising
TypeError
when indexes contain non-sortable entries (:issue:`41915`) - Bug in :meth:`MultiIndex.reindex` raising a
ValueError
when used on an empty :class:`MultiIndex` and indexing only a specific level (:issue:`41170`) - Bug in :meth:`MultiIndex.reindex` raising
TypeError
when reindexing against a flat :class:`Index` (:issue:`41707`)
- Bug in :meth:`Index.__repr__` when
display.max_seq_items=1
(:issue:`38415`) - Bug in :func:`read_csv` not recognizing scientific notation if the argument
decimal
is set andengine="python"
(:issue:`31920`) - Bug in :func:`read_csv` interpreting
NA
value as comment, whenNA
does contain the comment string fixed forengine="python"
(:issue:`34002`) - Bug in :func:`read_csv` raising an
IndexError
with multiple header columns andindex_col
is specified when the file has no data rows (:issue:`38292`) - Bug in :func:`read_csv` not accepting
usecols
with a different length thannames
forengine="python"
(:issue:`16469`) - Bug in :meth:`read_csv` returning object dtype when
delimiter=","
withusecols
andparse_dates
specified forengine="python"
(:issue:`35873`) - Bug in :func:`read_csv` raising a
TypeError
whennames
andparse_dates
is specified forengine="c"
(:issue:`33699`) - Bug in :func:`read_clipboard` and :func:`DataFrame.to_clipboard` not working in WSL (:issue:`38527`)
- Allow custom error values for the
parse_dates
argument of :func:`read_sql`, :func:`read_sql_query` and :func:`read_sql_table` (:issue:`35185`) - Bug in :meth:`DataFrame.to_hdf` and :meth:`Series.to_hdf` raising a
KeyError
when trying to apply for subclasses ofDataFrame
orSeries
(:issue:`33748`) - Bug in :meth:`.HDFStore.put` raising a wrong
TypeError
when saving a DataFrame with non-string dtype (:issue:`34274`) - Bug in :func:`json_normalize` resulting in the first element of a generator object not being included in the returned DataFrame (:issue:`35923`)
- Bug in :func:`read_csv` applying the thousands separator to date columns when the column should be parsed for dates and
usecols
is specified forengine="python"
(:issue:`39365`) - Bug in :func:`read_excel` forward filling :class:`MultiIndex` names when multiple header and index columns are specified (:issue:`34673`)
- Bug in :func:`read_excel` not respecting :func:`set_option` (:issue:`34252`)
- Bug in :func:`read_csv` not switching
true_values
andfalse_values
for nullable Boolean dtype (:issue:`34655`) - Bug in :func:`read_json` when
orient="split"
not maintaining a numeric string index (:issue:`28556`) - :meth:`read_sql` returned an empty generator if
chunksize
was non-zero and the query returned no results. Now returns a generator with a single empty DataFrame (:issue:`34411`) - Bug in :func:`read_hdf` returning unexpected records when filtering on categorical string columns using the
where
parameter (:issue:`39189`) - Bug in :func:`read_sas` raising a
ValueError
whendatetimes
were null (:issue:`39725`) - Bug in :func:`read_excel` dropping empty values from single-column spreadsheets (:issue:`39808`)
- Bug in :func:`read_excel` loading trailing empty rows/columns for some filetypes (:issue:`41167`)
- Bug in :func:`read_excel` raising an
AttributeError
when the excel file had aMultiIndex
header followed by two empty rows and no index (:issue:`40442`) - Bug in :func:`read_excel`, :func:`read_csv`, :func:`read_table`, :func:`read_fwf`, and :func:`read_clipboard` where one blank row after a
MultiIndex
header with no index would be dropped (:issue:`40442`) - Bug in :meth:`DataFrame.to_string` misplacing the truncation column when
index=False
(:issue:`40904`) - Bug in :meth:`DataFrame.to_string` adding an extra dot and misaligning the truncation row when
index=False
(:issue:`40904`) - Bug in :func:`read_orc` always raising an
AttributeError
(:issue:`40918`) - Bug in :func:`read_csv` and :func:`read_table` silently ignoring
prefix
ifnames
andprefix
are defined, now raising aValueError
(:issue:`39123`) - Bug in :func:`read_csv` and :func:`read_excel` not respecting the dtype for a duplicated column name when
mangle_dupe_cols
is set toTrue
(:issue:`35211`) - Bug in :func:`read_csv` silently ignoring
sep
ifdelimiter
andsep
are defined, now raising aValueError
(:issue:`39823`) - Bug in :func:`read_csv` and :func:`read_table` misinterpreting arguments when
sys.setprofile
had been previously called (:issue:`41069`) - Bug in the conversion from PyArrow to pandas (e.g. for reading Parquet) with nullable dtypes and a PyArrow array whose data buffer size is not a multiple of the dtype size (:issue:`40896`)
- Bug in :func:`read_excel` would raise an error when pandas could not determine the file type even though the user specified the
engine
argument (:issue:`41225`) - Bug in :func:`read_clipboard` copying from an excel file shifts values into the wrong column if there are null values in first column (:issue:`41108`)
- Bug in :meth:`DataFrame.to_hdf` and :meth:`Series.to_hdf` raising a
TypeError
when trying to append a string column to an incompatible column (:issue:`41897`)
- Comparisons of :class:`Period` objects or :class:`Index`, :class:`Series`, or :class:`DataFrame` with mismatched
PeriodDtype
now behave like other mismatched-type comparisons, returningFalse
for equals,True
for not-equal, and raisingTypeError
for inequality checks (:issue:`39274`)
- Bug in :func:`plotting.scatter_matrix` raising when 2d
ax
argument passed (:issue:`16253`) - Prevent warnings when Matplotlib's
constrained_layout
is enabled (:issue:`25261`) - Bug in :func:`DataFrame.plot` was showing the wrong colors in the legend if the function was called repeatedly and some calls used
yerr
while others didn't (:issue:`39522`) - Bug in :func:`DataFrame.plot` was showing the wrong colors in the legend if the function was called repeatedly and some calls used
secondary_y
and others uselegend=False
(:issue:`40044`) - Bug in :meth:`DataFrame.plot.box` when
dark_background
theme was selected, caps or min/max markers for the plot were not visible (:issue:`40769`)
- Bug in :meth:`.DataFrameGroupBy.agg` and :meth:`.SeriesGroupBy.agg` with :class:`PeriodDtype` columns incorrectly casting results too aggressively (:issue:`38254`)
- Bug in :meth:`.SeriesGroupBy.value_counts` where unobserved categories in a grouped categorical Series were not tallied (:issue:`38672`)
- Bug in :meth:`.SeriesGroupBy.value_counts` where an error was raised on an empty Series (:issue:`39172`)
- Bug in :meth:`.GroupBy.indices` would contain non-existent indices when null values were present in the groupby keys (:issue:`9304`)
- Fixed bug in :meth:`.DataFrameGroupBy.sum` and :meth:`.SeriesGroupBy.sum` causing a loss of precision by now using Kahan summation (:issue:`38778`)
- Fixed bug in :meth:`.DataFrameGroupBy.cumsum`, :meth:`.SeriesGroupBy.cumsum`, :meth:`.DataFrameGroupBy.mean`, and :meth:`.SeriesGroupBy.mean` causing loss of precision through using Kahan summation (:issue:`38934`)
- Bug in :meth:`.Resampler.aggregate` and :meth:`DataFrame.transform` raising a
TypeError
instead ofSpecificationError
when missing keys had mixed dtypes (:issue:`39025`) - Bug in :meth:`.DataFrameGroupBy.idxmin` and :meth:`.DataFrameGroupBy.idxmax` with
ExtensionDtype
columns (:issue:`38733`) - Bug in :meth:`Series.resample` would raise when the index was a :class:`PeriodIndex` consisting of
NaT
(:issue:`39227`) - Bug in :meth:`.RollingGroupby.corr` and :meth:`.ExpandingGroupby.corr` where the groupby column would return
0
instead ofnp.nan
when providingother
that was longer than each group (:issue:`39591`) - Bug in :meth:`.ExpandingGroupby.corr` and :meth:`.ExpandingGroupby.cov` where
1
would be returned instead ofnp.nan
when providingother
that was longer than each group (:issue:`39591`) - Bug in :meth:`.DataFrameGroupBy.mean`, :meth:`.SeriesGroupBy.mean`, :meth:`.DataFrameGroupBy.median`, :meth:`.SeriesGroupBy.median`, and :meth:`DataFrame.pivot_table` not propagating metadata (:issue:`28283`)
- Bug in :meth:`Series.rolling` and :meth:`DataFrame.rolling` not calculating window bounds correctly when window is an offset and dates are in descending order (:issue:`40002`)
- Bug in :meth:`Series.groupby` and :meth:`DataFrame.groupby` on an empty
Series
orDataFrame
would lose index, columns, and/or data types when directly using the methodsidxmax
,idxmin
,mad
,min
,max
,sum
,prod
, andskew
or using them throughapply
,aggregate
, orresample
(:issue:`26411`) - Bug in :meth:`.DataFrameGroupBy.apply` and :meth:`.SeriesGroupBy.apply` where a :class:`MultiIndex` would be created instead of an :class:`Index` when used on a :class:`.RollingGroupby` object (:issue:`39732`)
- Bug in :meth:`.DataFrameGroupBy.sample` where an error was raised when
weights
was specified and the index was an :class:`Int64Index` (:issue:`39927`) - Bug in :meth:`.DataFrameGroupBy.aggregate` and :meth:`.Resampler.aggregate` would sometimes raise a
SpecificationError
when passed a dictionary and columns were missing; will now always raise aKeyError
instead (:issue:`40004`) - Bug in :meth:`.DataFrameGroupBy.sample` where column selection was not applied before computing the result (:issue:`39928`)
- Bug in :class:`.ExponentialMovingWindow` when calling
__getitem__
would incorrectly raise aValueError
when providingtimes
(:issue:`40164`) - Bug in :class:`.ExponentialMovingWindow` when calling
__getitem__
would not retaincom
,span
,alpha
orhalflife
attributes (:issue:`40164`) - :class:`.ExponentialMovingWindow` now raises a
NotImplementedError
when specifyingtimes
withadjust=False
due to an incorrect calculation (:issue:`40098`) - Bug in :meth:`.ExponentialMovingWindowGroupby.mean` where the
times
argument was ignored whenengine='numba'
(:issue:`40951`) - Bug in :meth:`.ExponentialMovingWindowGroupby.mean` where the wrong times were used the in case of multiple groups (:issue:`40951`)
- Bug in :class:`.ExponentialMovingWindowGroupby` where the times vector and values became out of sync for non-trivial groups (:issue:`40951`)
- Bug in :meth:`Series.asfreq` and :meth:`DataFrame.asfreq` dropping rows when the index was not sorted (:issue:`39805`)
- Bug in aggregation functions for :class:`DataFrame` not respecting
numeric_only
argument whenlevel
keyword was given (:issue:`40660`) - Bug in :meth:`.SeriesGroupBy.aggregate` where using a user-defined function to aggregate a Series with an object-typed :class:`Index` causes an incorrect :class:`Index` shape (:issue:`40014`)
- Bug in :class:`.RollingGroupby` where
as_index=False
argument ingroupby
was ignored (:issue:`39433`) - Bug in :meth:`.DataFrameGroupBy.any`, :meth:`.SeriesGroupBy.any`, :meth:`.DataFrameGroupBy.all` and :meth:`.SeriesGroupBy.all` raising a
ValueError
when using with nullable type columns holdingNA
even withskipna=True
(:issue:`40585`) - Bug in :meth:`.DataFrameGroupBy.cummin`, :meth:`.SeriesGroupBy.cummin`, :meth:`.DataFrameGroupBy.cummax` and :meth:`.SeriesGroupBy.cummax` incorrectly rounding integer values near the
int64
implementations bounds (:issue:`40767`) - Bug in :meth:`.DataFrameGroupBy.rank` and :meth:`.SeriesGroupBy.rank` with nullable dtypes incorrectly raising a
TypeError
(:issue:`41010`) - Bug in :meth:`.DataFrameGroupBy.cummin`, :meth:`.SeriesGroupBy.cummin`, :meth:`.DataFrameGroupBy.cummax` and :meth:`.SeriesGroupBy.cummax` computing wrong result with nullable data types too large to roundtrip when casting to float (:issue:`37493`)
- Bug in :meth:`DataFrame.rolling` returning mean zero for all
NaN
window withmin_periods=0
if calculation is not numerical stable (:issue:`41053`) - Bug in :meth:`DataFrame.rolling` returning sum not zero for all
NaN
window withmin_periods=0
if calculation is not numerical stable (:issue:`41053`) - Bug in :meth:`.SeriesGroupBy.agg` failing to retain ordered :class:`CategoricalDtype` on order-preserving aggregations (:issue:`41147`)
- Bug in :meth:`.DataFrameGroupBy.min`, :meth:`.SeriesGroupBy.min`, :meth:`.DataFrameGroupBy.max` and :meth:`.SeriesGroupBy.max` with multiple object-dtype columns and
numeric_only=False
incorrectly raising aValueError
(:issue:`41111`) - Bug in :meth:`.DataFrameGroupBy.rank` with the GroupBy object's
axis=0
and therank
method's keywordaxis=1
(:issue:`41320`) - Bug in :meth:`DataFrameGroupBy.__getitem__` with non-unique columns incorrectly returning a malformed :class:`SeriesGroupBy` instead of :class:`DataFrameGroupBy` (:issue:`41427`)
- Bug in :meth:`.DataFrameGroupBy.transform` with non-unique columns incorrectly raising an
AttributeError
(:issue:`41427`) - Bug in :meth:`.Resampler.apply` with non-unique columns incorrectly dropping duplicated columns (:issue:`41445`)
- Bug in :meth:`Series.groupby` aggregations incorrectly returning empty :class:`Series` instead of raising
TypeError
on aggregations that are invalid for its dtype, e.g..prod
withdatetime64[ns]
dtype (:issue:`41342`) - Bug in :class:`DataFrameGroupBy` aggregations incorrectly failing to drop columns with invalid dtypes for that aggregation when there are no valid columns (:issue:`41291`)
- Bug in :meth:`DataFrame.rolling.__iter__` where
on
was not assigned to the index of the resulting objects (:issue:`40373`) - Bug in :meth:`.DataFrameGroupBy.transform` and :meth:`.DataFrameGroupBy.agg` with
engine="numba"
where*args
were being cached with the user passed function (:issue:`41647`) - Bug in :class:`DataFrameGroupBy` methods
agg
,transform
,sum
,bfill
,ffill
,pad
,pct_change
,shift
,ohlc
dropping.columns.names
(:issue:`41497`)
- Bug in :func:`merge` raising error when performing an inner join with partial index and
right_index=True
when there was no overlap between indices (:issue:`33814`) - Bug in :meth:`DataFrame.unstack` with missing levels led to incorrect index names (:issue:`37510`)
- Bug in :func:`merge_asof` propagating the right Index with
left_index=True
andright_on
specification instead of left Index (:issue:`33463`) - Bug in :meth:`DataFrame.join` on a DataFrame with a :class:`MultiIndex` returned the wrong result when one of both indexes had only one level (:issue:`36909`)
- :func:`merge_asof` now raises a
ValueError
instead of a crypticTypeError
in case of non-numerical merge columns (:issue:`29130`) - Bug in :meth:`DataFrame.join` not assigning values correctly when the DataFrame had a :class:`MultiIndex` where at least one dimension had dtype
Categorical
with non-alphabetically sorted categories (:issue:`38502`) - :meth:`Series.value_counts` and :meth:`Series.mode` now return consistent keys in original order (:issue:`12679`, :issue:`11227` and :issue:`39007`)
- Bug in :meth:`DataFrame.stack` not handling
NaN
in :class:`MultiIndex` columns correctly (:issue:`39481`) - Bug in :meth:`DataFrame.apply` would give incorrect results when the argument
func
was a string,axis=1
, and the axis argument was not supported; now raises aValueError
instead (:issue:`39211`) - Bug in :meth:`DataFrame.sort_values` not reshaping the index correctly after sorting on columns when
ignore_index=True
(:issue:`39464`) - Bug in :meth:`DataFrame.append` returning incorrect dtypes with combinations of
ExtensionDtype
dtypes (:issue:`39454`) - Bug in :meth:`DataFrame.append` returning incorrect dtypes when used with combinations of
datetime64
andtimedelta64
dtypes (:issue:`39574`) - Bug in :meth:`DataFrame.append` with a :class:`DataFrame` with a :class:`MultiIndex` and appending a :class:`Series` whose :class:`Index` is not a :class:`MultiIndex` (:issue:`41707`)
- Bug in :meth:`DataFrame.pivot_table` returning a :class:`MultiIndex` for a single value when operating on an empty DataFrame (:issue:`13483`)
- :class:`Index` can now be passed to the :func:`numpy.all` function (:issue:`40180`)
- Bug in :meth:`DataFrame.stack` not preserving
CategoricalDtype
in a :class:`MultiIndex` (:issue:`36991`) - Bug in :func:`to_datetime` raising an error when the input sequence contained unhashable items (:issue:`39756`)
- Bug in :meth:`Series.explode` preserving the index when
ignore_index
wasTrue
and values were scalars (:issue:`40487`) - Bug in :func:`to_datetime` raising a
ValueError
when :class:`Series` containsNone
andNaT
and has more than 50 elements (:issue:`39882`) - Bug in :meth:`Series.unstack` and :meth:`DataFrame.unstack` with object-dtype values containing timezone-aware datetime objects incorrectly raising
TypeError
(:issue:`41875`) - Bug in :meth:`DataFrame.melt` raising
InvalidIndexError
when :class:`DataFrame` has duplicate columns used asvalue_vars
(:issue:`41951`)
- Bug in :meth:`DataFrame.sparse.to_coo` raising a
KeyError
with columns that are a numeric :class:`Index` without a0
(:issue:`18414`) - Bug in :meth:`SparseArray.astype` with
copy=False
producing incorrect results when going from integer dtype to floating dtype (:issue:`34456`) - Bug in :meth:`SparseArray.max` and :meth:`SparseArray.min` would always return an empty result (:issue:`40921`)
- Bug in :meth:`DataFrame.where` when
other
is a Series with an :class:`ExtensionDtype` (:issue:`38729`) - Fixed bug where :meth:`Series.idxmax`, :meth:`Series.idxmin`, :meth:`Series.argmax`, and :meth:`Series.argmin` would fail when the underlying data is an :class:`ExtensionArray` (:issue:`32749`, :issue:`33719`, :issue:`36566`)
- Fixed bug where some properties of subclasses of :class:`PandasExtensionDtype` where improperly cached (:issue:`40329`)
- Bug in :meth:`DataFrame.mask` where masking a DataFrame with an :class:`ExtensionDtype` raises a
ValueError
(:issue:`40941`)
- Bug in :class:`.Styler` where the
subset
argument in methods raised an error for some valid MultiIndex slices (:issue:`33562`) - :class:`.Styler` rendered HTML output has seen minor alterations to support w3 good code standards (:issue:`39626`)
- Bug in :class:`.Styler` where rendered HTML was missing a column class identifier for certain header cells (:issue:`39716`)
- Bug in :meth:`.Styler.background_gradient` where text-color was not determined correctly (:issue:`39888`)
- Bug in :meth:`.Styler.set_table_styles` where multiple elements in CSS-selectors of the
table_styles
argument were not correctly added (:issue:`34061`) - Bug in :class:`.Styler` where copying from Jupyter dropped the top left cell and misaligned headers (:issue:`12147`)
- Bug in :class:`Styler.where` where
kwargs
were not passed to the applicable callable (:issue:`40845`) - Bug in :class:`.Styler` causing CSS to duplicate on multiple renders (:issue:`39395`, :issue:`40334`)
inspect.getmembers(Series)
no longer raises anAbstractMethodError
(:issue:`38782`)- Bug in :meth:`Series.where` with numeric dtype and
other=None
not casting tonan
(:issue:`39761`) - Bug in :func:`.assert_series_equal`, :func:`.assert_frame_equal`, :func:`.assert_index_equal` and :func:`.assert_extension_array_equal` incorrectly raising when an attribute has an unrecognized NA type (:issue:`39461`)
- Bug in :func:`.assert_index_equal` with
exact=True
not raising when comparing :class:`CategoricalIndex` instances withInt64Index
andRangeIndex
categories (:issue:`41263`) - Bug in :meth:`DataFrame.equals`, :meth:`Series.equals`, and :meth:`Index.equals` with object-dtype containing
np.datetime64("NaT")
ornp.timedelta64("NaT")
(:issue:`39650`) - Bug in :func:`show_versions` where console JSON output was not proper JSON (:issue:`39701`)
- pandas can now compile on z/OS when using xlc (:issue:`35826`)
- Bug in :func:`pandas.util.hash_pandas_object` not recognizing
hash_key
,encoding
andcategorize
when the input object type is a :class:`DataFrame` (:issue:`41404`)
.. contributors:: v1.2.5..v1.3.0