Skip to content

Commit f9ffff7

Browse files
Merge remote-tracking branch 'upstream/main' into string-dtype-predicates-nan-propagation
2 parents cf242a2 + 078e11f commit f9ffff7

File tree

108 files changed

+1263
-642
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

108 files changed

+1263
-642
lines changed

asv_bench/benchmarks/indexing_engines.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ def setup(self, engine_and_dtype, index_type, unique, N):
8787
arr = np.array([1, 2, 3], dtype=dtype).repeat(N)
8888

8989
self.data = engine(arr)
90-
# code belows avoids populating the mapping etc. while timing.
90+
# code below avoids populating the mapping etc. while timing.
9191
self.data.get_loc(2)
9292

9393
self.key_middle = arr[len(arr) // 2]
@@ -140,7 +140,7 @@ def setup(self, engine_and_dtype, index_type, unique, N):
140140
mask[-1] = True
141141

142142
self.data = engine(BaseMaskedArray(arr, mask))
143-
# code belows avoids populating the mapping etc. while timing.
143+
# code below avoids populating the mapping etc. while timing.
144144
self.data.get_loc(2)
145145

146146
self.key_middle = arr[len(arr) // 2]
@@ -169,7 +169,7 @@ def setup(self, index_type):
169169
}[index_type]
170170

171171
self.data = libindex.ObjectEngine(arr)
172-
# code belows avoids populating the mapping etc. while timing.
172+
# code below avoids populating the mapping etc. while timing.
173173
self.data.get_loc("b")
174174

175175
def time_get_loc(self, index_type):

ci/code_checks.sh

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -70,39 +70,11 @@ if [[ -z "$CHECK" || "$CHECK" == "docstrings" ]]; then
7070
--format=actions \
7171
-i ES01 `# For now it is ok if docstrings are missing the extended summary` \
7272
-i "pandas.Series.dt PR01" `# Accessors are implemented as classes, but we do not document the Parameters section` \
73-
-i "pandas.MultiIndex.reorder_levels RT03,SA01" \
74-
-i "pandas.MultiIndex.to_frame RT03" \
7573
-i "pandas.NA SA01" \
76-
-i "pandas.NaT SA01" \
7774
-i "pandas.Period.freq GL08" \
78-
-i "pandas.Period.freqstr SA01" \
7975
-i "pandas.Period.ordinal GL08" \
80-
-i "pandas.Period.strftime PR01,SA01" \
8176
-i "pandas.Period.to_timestamp SA01" \
82-
-i "pandas.PeriodDtype SA01" \
8377
-i "pandas.PeriodDtype.freq SA01" \
84-
-i "pandas.PeriodIndex.day SA01" \
85-
-i "pandas.PeriodIndex.day_of_week SA01" \
86-
-i "pandas.PeriodIndex.day_of_year SA01" \
87-
-i "pandas.PeriodIndex.dayofweek SA01" \
88-
-i "pandas.PeriodIndex.dayofyear SA01" \
89-
-i "pandas.PeriodIndex.days_in_month SA01" \
90-
-i "pandas.PeriodIndex.daysinmonth SA01" \
91-
-i "pandas.PeriodIndex.from_fields PR07,SA01" \
92-
-i "pandas.PeriodIndex.from_ordinals SA01" \
93-
-i "pandas.PeriodIndex.hour SA01" \
94-
-i "pandas.PeriodIndex.is_leap_year SA01" \
95-
-i "pandas.PeriodIndex.minute SA01" \
96-
-i "pandas.PeriodIndex.month SA01" \
97-
-i "pandas.PeriodIndex.quarter SA01" \
98-
-i "pandas.PeriodIndex.qyear GL08" \
99-
-i "pandas.PeriodIndex.second SA01" \
100-
-i "pandas.PeriodIndex.to_timestamp RT03,SA01" \
101-
-i "pandas.PeriodIndex.week SA01" \
102-
-i "pandas.PeriodIndex.weekday SA01" \
103-
-i "pandas.PeriodIndex.weekofyear SA01" \
104-
-i "pandas.PeriodIndex.year SA01" \
105-
-i "pandas.RangeIndex PR07" \
10678
-i "pandas.RangeIndex.from_range PR01,SA01" \
10779
-i "pandas.RangeIndex.start SA01" \
10880
-i "pandas.RangeIndex.step SA01" \
@@ -124,7 +96,6 @@ if [[ -z "$CHECK" || "$CHECK" == "docstrings" ]]; then
12496
-i "pandas.Series.dt.month_name PR01,PR02" \
12597
-i "pandas.Series.dt.nanoseconds SA01" \
12698
-i "pandas.Series.dt.normalize PR01" \
127-
-i "pandas.Series.dt.qyear GL08" \
12899
-i "pandas.Series.dt.round PR01,PR02" \
129100
-i "pandas.Series.dt.seconds SA01" \
130101
-i "pandas.Series.dt.strftime PR01,PR02" \
@@ -134,14 +105,10 @@ if [[ -z "$CHECK" || "$CHECK" == "docstrings" ]]; then
134105
-i "pandas.Series.dt.tz_localize PR01,PR02" \
135106
-i "pandas.Series.dt.unit GL08" \
136107
-i "pandas.Series.pad PR01,SA01" \
137-
-i "pandas.Series.sem PR01,RT03,SA01" \
138-
-i "pandas.Series.sparse PR01,SA01" \
139108
-i "pandas.Series.sparse.fill_value SA01" \
140109
-i "pandas.Series.sparse.from_coo PR07,SA01" \
141110
-i "pandas.Series.sparse.npoints SA01" \
142111
-i "pandas.Series.sparse.sp_values SA01" \
143-
-i "pandas.Series.sparse.to_coo PR07,RT03,SA01" \
144-
-i "pandas.Series.std PR01,RT03,SA01" \
145112
-i "pandas.Timedelta.asm8 SA01" \
146113
-i "pandas.Timedelta.ceil SA01" \
147114
-i "pandas.Timedelta.components SA01" \
@@ -154,22 +121,15 @@ if [[ -z "$CHECK" || "$CHECK" == "docstrings" ]]; then
154121
-i "pandas.Timedelta.to_timedelta64 SA01" \
155122
-i "pandas.Timedelta.total_seconds SA01" \
156123
-i "pandas.Timedelta.view SA01" \
157-
-i "pandas.TimedeltaIndex.as_unit RT03,SA01" \
158124
-i "pandas.TimedeltaIndex.components SA01" \
159125
-i "pandas.TimedeltaIndex.microseconds SA01" \
160126
-i "pandas.TimedeltaIndex.nanoseconds SA01" \
161127
-i "pandas.TimedeltaIndex.seconds SA01" \
162128
-i "pandas.TimedeltaIndex.to_pytimedelta RT03,SA01" \
163-
-i "pandas.Timestamp.fold GL08" \
164-
-i "pandas.Timestamp.hour GL08" \
165129
-i "pandas.Timestamp.max PR02" \
166-
-i "pandas.Timestamp.microsecond GL08" \
167130
-i "pandas.Timestamp.min PR02" \
168-
-i "pandas.Timestamp.minute GL08" \
169-
-i "pandas.Timestamp.month GL08" \
170131
-i "pandas.Timestamp.nanosecond GL08" \
171132
-i "pandas.Timestamp.resolution PR02" \
172-
-i "pandas.Timestamp.second GL08" \
173133
-i "pandas.Timestamp.tzinfo GL08" \
174134
-i "pandas.Timestamp.value GL08" \
175135
-i "pandas.Timestamp.year GL08" \
@@ -260,13 +220,7 @@ if [[ -z "$CHECK" || "$CHECK" == "docstrings" ]]; then
260220
-i "pandas.core.resample.Resampler.sum SA01" \
261221
-i "pandas.core.resample.Resampler.transform PR01,RT03,SA01" \
262222
-i "pandas.core.resample.Resampler.var SA01" \
263-
-i "pandas.core.window.expanding.Expanding.corr PR01" \
264-
-i "pandas.core.window.expanding.Expanding.count PR01" \
265-
-i "pandas.core.window.rolling.Rolling.max PR01" \
266-
-i "pandas.core.window.rolling.Window.std PR01" \
267-
-i "pandas.core.window.rolling.Window.var PR01" \
268223
-i "pandas.date_range RT03" \
269-
-i "pandas.errors.AbstractMethodError PR01,SA01" \
270224
-i "pandas.errors.AttributeConflictWarning SA01" \
271225
-i "pandas.errors.CSSWarning SA01" \
272226
-i "pandas.errors.CategoricalConversionWarning SA01" \

doc/source/development/contributing_codebase.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -605,7 +605,7 @@ The ``temp_file`` pytest fixture creates a temporary file :py:class:`Pathlib` ob
605605
pd.DataFrame([1]).to_csv(str(temp_file))
606606
607607
Please reference `pytest's documentation <https://docs.pytest.org/en/latest/how-to/tmp_path.html#the-default-base-temporary-directory>`_
608-
for the file retension policy.
608+
for the file retention policy.
609609

610610
Testing involving network connectivity
611611
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

doc/source/development/debugging_extensions.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ By specifying ``builddir="debug"`` all of the targets will be built and placed i
3030
Using Docker
3131
------------
3232

33-
To simplify the debugging process, pandas has created a Docker image with a debug build of Python and the gdb/Cython debuggers pre-installed. You may either ``docker pull pandas/pandas-debug`` to get access to this image or build it from the ``tooling/debug`` folder locallly.
33+
To simplify the debugging process, pandas has created a Docker image with a debug build of Python and the gdb/Cython debuggers pre-installed. You may either ``docker pull pandas/pandas-debug`` to get access to this image or build it from the ``tooling/debug`` folder locally.
3434

3535
You can then mount your pandas repository into this image via:
3636

doc/source/getting_started/index.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -613,7 +613,7 @@ the pandas-equivalent operations compared to software you already know:
613613

614614
Users of `Excel <https://en.wikipedia.org/wiki/Microsoft_Excel>`__
615615
or other spreadsheet programs will find that many of the concepts are
616-
transferrable to pandas.
616+
transferable to pandas.
617617

618618
+++
619619

doc/source/user_guide/cookbook.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -914,7 +914,7 @@ Using TimeGrouper and another grouping to create subgroups, then apply a custom
914914
<https://stackoverflow.com/questions/15408156/resampling-with-custom-periods>`__
915915

916916
`Resample intraday frame without adding new days
917-
<https://stackoverflow.com/questions/14898574/resample-intrday-pandas-dataframe-without-add-new-days>`__
917+
<https://stackoverflow.com/questions/14898574/resample-intraday-pandas-dataframe-without-add-new-days>`__
918918

919919
`Resample minute data
920920
<https://stackoverflow.com/questions/14861023/resampling-minute-data>`__

doc/source/user_guide/io.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ dtype_backend : {"numpy_nullable", "pyarrow"}, defaults to NumPy backed DataFram
169169
implementation when "numpy_nullable" is set, pyarrow is used for all
170170
dtypes if "pyarrow" is set.
171171

172-
The dtype_backends are still experimential.
172+
The dtype_backends are still experimental.
173173

174174
.. versionadded:: 2.0
175175

@@ -2893,7 +2893,7 @@ Read in the content of the "books.xml" as instance of ``StringIO`` or
28932893
df
28942894
28952895
Even read XML from AWS S3 buckets such as NIH NCBI PMC Article Datasets providing
2896-
Biomedical and Life Science Jorurnals:
2896+
Biomedical and Life Science Journals:
28972897

28982898
.. code-block:: python
28992899

doc/source/user_guide/style.ipynb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1182,7 +1182,7 @@
11821182
"Some styling functions are common enough that we've \"built them in\" to the `Styler`, so you don't have to write them and apply them yourself. The current list of such functions is:\n",
11831183
"\n",
11841184
" - [.highlight_null][nullfunc]: for use with identifying missing data. \n",
1185-
" - [.highlight_min][minfunc] and [.highlight_max][maxfunc]: for use with identifying extremeties in data.\n",
1185+
" - [.highlight_min][minfunc] and [.highlight_max][maxfunc]: for use with identifying extremities in data.\n",
11861186
" - [.highlight_between][betweenfunc] and [.highlight_quantile][quantilefunc]: for use with identifying classes within data.\n",
11871187
" - [.background_gradient][bgfunc]: a flexible method for highlighting cells based on their, or other, values on a numeric scale.\n",
11881188
" - [.text_gradient][textfunc]: similar method for highlighting text based on their, or other, values on a numeric scale.\n",

doc/source/user_guide/visualization.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1504,7 +1504,7 @@ Plotting with error bars
15041504

15051505
Plotting with error bars is supported in :meth:`DataFrame.plot` and :meth:`Series.plot`.
15061506

1507-
Horizontal and vertical error bars can be supplied to the ``xerr`` and ``yerr`` keyword arguments to :meth:`~DataFrame.plot()`. The error values can be specified using a variety of formats:
1507+
Horizontal and vertical error bars can be supplied to the ``xerr`` and ``yerr`` keyword arguments to :meth:`~DataFrame.plot`. The error values can be specified using a variety of formats:
15081508

15091509
* As a :class:`DataFrame` or ``dict`` of errors with column names matching the ``columns`` attribute of the plotting :class:`DataFrame` or matching the ``name`` attribute of the :class:`Series`.
15101510
* As a ``str`` indicating which of the columns of plotting :class:`DataFrame` contain the error values.

doc/source/whatsnew/index.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@ Version 3.0
1818

1919
v3.0.0
2020

21+
Version 2.3
22+
-----------
23+
24+
.. toctree::
25+
:maxdepth: 2
26+
27+
v2.3.0
2128

2229
Version 2.2
2330
-----------

doc/source/whatsnew/v0.15.0.rst

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,7 @@ Rolling/expanding moments improvements
490490
``ddof`` argument (with a default value of ``1``) was previously undocumented. (:issue:`8064`)
491491

492492
- :func:`ewma`, :func:`ewmstd`, :func:`ewmvol`, :func:`ewmvar`, :func:`ewmcov`, and :func:`ewmcorr`
493-
now interpret ``min_periods`` in the same manner that the :func:`rolling_*()` and :func:`expanding_*()` functions do:
493+
now interpret ``min_periods`` in the same manner that the :func:`rolling_*` and :func:`expanding_*` functions do:
494494
a given result entry will be ``NaN`` if the (expanding, in this case) window does not contain
495495
at least ``min_periods`` values. The previous behavior was to set to ``NaN`` the ``min_periods`` entries
496496
starting with the first non- ``NaN`` value. (:issue:`7977`)
@@ -567,7 +567,7 @@ Rolling/expanding moments improvements
567567
568568
.. warning::
569569

570-
By default (``ignore_na=False``) the :func:`ewm*()` functions' weights calculation
570+
By default (``ignore_na=False``) the :func:`ewm*` functions' weights calculation
571571
in the presence of missing values is different than in pre-0.15.0 versions.
572572
To reproduce the pre-0.15.0 calculation of weights in the presence of missing values
573573
one must specify explicitly ``ignore_na=True``.
@@ -576,7 +576,7 @@ Rolling/expanding moments improvements
576576
returning results with columns sorted by name and producing an error for non-unique columns;
577577
now handles non-unique columns and returns columns in original order
578578
(except for the case of two DataFrames with ``pairwise=False``, where behavior is unchanged) (:issue:`7542`)
579-
- Bug in :func:`rolling_count` and :func:`expanding_*()` functions unnecessarily producing error message for zero-length data (:issue:`8056`)
579+
- Bug in :func:`rolling_count` and :func:`expanding_*` functions unnecessarily producing error message for zero-length data (:issue:`8056`)
580580
- Bug in :func:`rolling_apply` and :func:`expanding_apply` interpreting ``min_periods=0`` as ``min_periods=1`` (:issue:`8080`)
581581
- Bug in :func:`expanding_std` and :func:`expanding_var` for a single value producing a confusing error message (:issue:`7900`)
582582
- Bug in :func:`rolling_std` and :func:`rolling_var` for a single value producing ``0`` rather than ``NaN`` (:issue:`7900`)
@@ -875,7 +875,7 @@ Other notable API changes:
875875
The behaviour of assigning a column to an existing dataframe as ``df['a'] = i``
876876
remains unchanged (this already returned an ``object`` column with a timezone).
877877

878-
- When passing multiple levels to :meth:`~pandas.DataFrame.stack()`, it will now raise a ``ValueError`` when the
878+
- When passing multiple levels to :meth:`~pandas.DataFrame.stack`, it will now raise a ``ValueError`` when the
879879
levels aren't all level names or all level numbers (:issue:`7660`). See
880880
:ref:`Reshaping by stacking and unstacking <reshaping.stack_multiple>`.
881881

@@ -1110,7 +1110,7 @@ Other:
11101110

11111111
- ``DataFrame.fillna`` can now accept a ``DataFrame`` as a fill value (:issue:`8377`)
11121112

1113-
- Passing multiple levels to :meth:`~pandas.DataFrame.stack()` will now work when multiple level
1113+
- Passing multiple levels to :meth:`~pandas.DataFrame.stack` will now work when multiple level
11141114
numbers are passed (:issue:`7660`). See
11151115
:ref:`Reshaping by stacking and unstacking <reshaping.stack_multiple>`.
11161116

doc/source/whatsnew/v0.15.1.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ Enhancements
263263

264264
- Raise errors in certain aggregation cases where an argument such as ``numeric_only`` is not handled (:issue:`8592`).
265265

266-
- Added support for 3-character ISO and non-standard country codes in :func:`io.wb.download()` (:issue:`8482`)
266+
- Added support for 3-character ISO and non-standard country codes in :func:`io.wb.download` (:issue:`8482`)
267267

268268
- World Bank data requests now will warn/raise based
269269
on an ``errors`` argument, as well as a list of hard-coded country codes and

doc/source/whatsnew/v0.21.0.rst

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ New keywords
318318
- :func:`Series.set_axis` and :func:`DataFrame.set_axis` now support the ``inplace`` parameter. (:issue:`14636`)
319319
- :func:`Series.to_pickle` and :func:`DataFrame.to_pickle` have gained a ``protocol`` parameter (:issue:`16252`). By default, this parameter is set to `HIGHEST_PROTOCOL <https://docs.python.org/3/library/pickle.html#data-stream-format>`__
320320
- :func:`read_feather` has gained the ``nthreads`` parameter for multi-threaded operations (:issue:`16359`)
321-
- :func:`DataFrame.clip()` and :func:`Series.clip()` have gained an ``inplace`` argument. (:issue:`15388`)
321+
- :func:`DataFrame.clip` and :func:`Series.clip` have gained an ``inplace`` argument. (:issue:`15388`)
322322
- :func:`crosstab` has gained a ``margins_name`` parameter to define the name of the row / column that will contain the totals when ``margins=True``. (:issue:`15972`)
323323
- :func:`read_json` now accepts a ``chunksize`` parameter that can be used when ``lines=True``. If ``chunksize`` is passed, read_json now returns an iterator which reads in ``chunksize`` lines with each iteration. (:issue:`17048`)
324324
- :func:`read_json` and :func:`~DataFrame.to_json` now accept a ``compression`` argument which allows them to transparently handle compressed files. (:issue:`17798`)
@@ -977,10 +977,10 @@ Other API changes
977977
Deprecations
978978
~~~~~~~~~~~~
979979

980-
- :meth:`DataFrame.from_csv` and :meth:`Series.from_csv` have been deprecated in favor of :func:`read_csv()` (:issue:`4191`)
981-
- :func:`read_excel()` has deprecated ``sheetname`` in favor of ``sheet_name`` for consistency with ``.to_excel()`` (:issue:`10559`).
982-
- :func:`read_excel()` has deprecated ``parse_cols`` in favor of ``usecols`` for consistency with :func:`read_csv` (:issue:`4988`)
983-
- :func:`read_csv()` has deprecated the ``tupleize_cols`` argument. Column tuples will always be converted to a ``MultiIndex`` (:issue:`17060`)
980+
- :meth:`DataFrame.from_csv` and :meth:`Series.from_csv` have been deprecated in favor of :func:`read_csv` (:issue:`4191`)
981+
- :func:`read_excel` has deprecated ``sheetname`` in favor of ``sheet_name`` for consistency with ``.to_excel()`` (:issue:`10559`).
982+
- :func:`read_excel` has deprecated ``parse_cols`` in favor of ``usecols`` for consistency with :func:`read_csv` (:issue:`4988`)
983+
- :func:`read_csv` has deprecated the ``tupleize_cols`` argument. Column tuples will always be converted to a ``MultiIndex`` (:issue:`17060`)
984984
- :meth:`DataFrame.to_csv` has deprecated the ``tupleize_cols`` argument. MultiIndex columns will be always written as rows in the CSV file (:issue:`17060`)
985985
- The ``convert`` parameter has been deprecated in the ``.take()`` method, as it was not being respected (:issue:`16948`)
986986
- ``pd.options.html.border`` has been deprecated in favor of ``pd.options.display.html.border`` (:issue:`15793`).
@@ -1045,7 +1045,7 @@ return the position of the maximum or minimum.
10451045
Removal of prior version deprecations/changes
10461046
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
10471047

1048-
- :func:`read_excel()` has dropped the ``has_index_names`` parameter (:issue:`10967`)
1048+
- :func:`read_excel` has dropped the ``has_index_names`` parameter (:issue:`10967`)
10491049
- The ``pd.options.display.height`` configuration has been dropped (:issue:`3663`)
10501050
- The ``pd.options.display.line_width`` configuration has been dropped (:issue:`2881`)
10511051
- The ``pd.options.display.mpl_style`` configuration has been dropped (:issue:`12190`)
@@ -1154,7 +1154,7 @@ GroupBy/resample/rolling
11541154

11551155
- Bug in ``DataFrame.resample(...).size()`` where an empty ``DataFrame`` did not return a ``Series`` (:issue:`14962`)
11561156
- Bug in :func:`infer_freq` causing indices with 2-day gaps during the working week to be wrongly inferred as business daily (:issue:`16624`)
1157-
- Bug in ``.rolling(...).quantile()`` which incorrectly used different defaults than :func:`Series.quantile()` and :func:`DataFrame.quantile()` (:issue:`9413`, :issue:`16211`)
1157+
- Bug in ``.rolling(...).quantile()`` which incorrectly used different defaults than :func:`Series.quantile` and :func:`DataFrame.quantile` (:issue:`9413`, :issue:`16211`)
11581158
- Bug in ``groupby.transform()`` that would coerce boolean dtypes back to float (:issue:`16875`)
11591159
- Bug in ``Series.resample(...).apply()`` where an empty ``Series`` modified the source index and did not return the name of a ``Series`` (:issue:`14313`)
11601160
- Bug in ``.rolling(...).apply(...)`` with a ``DataFrame`` with a ``DatetimeIndex``, a ``window`` of a timedelta-convertible and ``min_periods >= 1`` (:issue:`15305`)
@@ -1194,7 +1194,7 @@ Reshaping
11941194
Numeric
11951195
^^^^^^^
11961196
- Bug in ``.clip()`` with ``axis=1`` and a list-like for ``threshold`` is passed; previously this raised ``ValueError`` (:issue:`15390`)
1197-
- :func:`Series.clip()` and :func:`DataFrame.clip()` now treat NA values for upper and lower arguments as ``None`` instead of raising ``ValueError`` (:issue:`17276`).
1197+
- :func:`Series.clip` and :func:`DataFrame.clip` now treat NA values for upper and lower arguments as ``None`` instead of raising ``ValueError`` (:issue:`17276`).
11981198

11991199

12001200
Categorical

0 commit comments

Comments
 (0)