Skip to content

Commit ed4d512

Browse files
Merge branch 'pandas-dev:main' into fix/read_sql_percent
2 parents f0b2f20 + 2d73d62 commit ed4d512

Some content is hidden

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

67 files changed

+681
-291
lines changed

.github/PULL_REQUEST_TEMPLATE.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
- [ ] All [code checks passed](https://pandas.pydata.org/pandas-docs/dev/development/contributing_codebase.html#pre-commit).
44
- [ ] Added [type annotations](https://pandas.pydata.org/pandas-docs/dev/development/contributing_codebase.html#type-hints) to new arguments/methods/functions.
55
- [ ] Added an entry in the latest `doc/source/whatsnew/vX.X.X.rst` file if fixing a bug or adding a new feature.
6+
- [ ] If I used AI to develop this pull request, I prompted it to follow `AGENTS.md`.

AGENTS.md

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# pandas Agent Instructions
2+
3+
## Project Overview
4+
`pandas` is an open source, BSD-licensed library providing high-performance, easy-to-use data structures and data analysis tools for the Python programming language.
5+
6+
## Purpose
7+
- Assist contributors by suggesting code changes, tests, and documentation edits for the pandas repository while preserving stability and compatibility.
8+
9+
## Persona & Tone
10+
- Concise, neutral, code-focused. Prioritize correctness, readability, and tests.
11+
12+
## Project Guidelines
13+
- Be sure to follow all guidelines for contributing to the codebase specified at https://pandas.pydata.org/docs/development/contributing_codebase.html
14+
- These guidelines are also available in the following local files, which should be loaded into context and adhered to
15+
- doc/source/development/contributing_codebase.rst
16+
- doc/source/development/contributing_docstring.rst
17+
- doc/source/development/contributing_documentation.rst
18+
- doc/source/development/contributing.rst
19+
20+
## Decision heuristics
21+
- Favor small, backward-compatible changes with tests.
22+
- If a change would be breaking, propose it behind a deprecation path and document the rationale.
23+
- Prefer readability over micro-optimizations unless benchmarks are requested.
24+
- Add tests for behavioral changes; update docs only after code change is final.
25+
26+
## Type hints guidance (summary)
27+
- Prefer PEP 484 style and types in pandas._typing when appropriate.
28+
- Avoid unnecessary use of typing.cast; prefer refactors that convey types to type-checkers.
29+
- Use builtin generics (list, dict) when possible.
30+
31+
## Docstring guidance (summary)
32+
- Follow NumPy / numpydoc conventions used across the repo: short summary, extended summary, Parameters, Returns/Yields, See Also, Notes, Examples.
33+
- Ensure examples are deterministic, import numpy/pandas as documented, and pass doctest rules used by docs validation.
34+
- Preserve formatting rules: triple double-quotes, no blank line before/after docstring, parameter formatting ("name : type, default ..."), types and examples conventions.
35+
36+
## Pull Requests (summary)
37+
- Pull request titles should be descriptive and include one of the following prefixes:
38+
- ENH: Enhancement, new functionality
39+
- BUG: Bug fix
40+
- DOC: Additions/updates to documentation
41+
- TST: Additions/updates to tests
42+
- BLD: Updates to the build process/scripts
43+
- PERF: Performance improvement
44+
- TYP: Type annotations
45+
- CLN: Code cleanup
46+
- Pull request descriptions should follow the template, and **succinctly** describe the change being made. Usually a few sentences is sufficient.
47+
- Pull requests which are resolving an existing Github Issue should include a link to the issue in the PR Description.
48+
- Do not add summaries or additional comments to individual commit messages. The single PR description is sufficient.

doc/source/user_guide/io.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ on_bad_lines : {{'error', 'warn', 'skip'}}, default 'error'
343343
Specifies what to do upon encountering a bad line (a line with too many fields).
344344
Allowed values are :
345345

346-
- 'error', raise an ParserError when a bad line is encountered.
346+
- 'error', raise a ParserError when a bad line is encountered.
347347
- 'warn', print a warning when a bad line is encountered and skip that line.
348348
- 'skip', skip bad lines without raising or warning when they are encountered.
349349

doc/source/whatsnew/index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ Version 2.3
2424
.. toctree::
2525
:maxdepth: 2
2626

27+
v2.3.4
2728
v2.3.3
2829
v2.3.2
2930
v2.3.1

doc/source/whatsnew/v2.3.4.rst

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
.. _whatsnew_234:
2+
3+
What's new in 2.3.4 (November XX, 2025)
4+
----------------------------------------
5+
6+
These are the changes in pandas 2.3.4. See :ref:`release` for a full changelog
7+
including other versions of pandas.
8+
9+
{{ header }}
10+
11+
.. ---------------------------------------------------------------------------
12+
13+
Bug fixes
14+
^^^^^^^^^
15+
- Bug in :meth:`DataFrame.__getitem__` returning modified columns when called with ``slice`` in Python 3.12 (:issue:`57500`)
16+
17+
.. ---------------------------------------------------------------------------
18+
.. _whatsnew_234.contributors:
19+
20+
Contributors
21+
~~~~~~~~~~~~

doc/source/whatsnew/v3.0.0.rst

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1032,13 +1032,13 @@ Bug fixes
10321032
Categorical
10331033
^^^^^^^^^^^
10341034
- Bug in :class:`Categorical` where constructing from a pandas :class:`Series` or :class:`Index` with ``dtype='object'`` did not preserve the categories' dtype as ``object``; now the ``categories.dtype`` is preserved as ``object`` for these cases, while numpy arrays and Python sequences with ``dtype='object'`` continue to infer the most specific dtype (for example, ``str`` if all elements are strings) (:issue:`61778`)
1035+
- Bug in :class:`pandas.Categorical` displaying string categories without quotes when using "string" dtype (:issue:`63045`)
10351036
- Bug in :func:`Series.apply` where ``nan`` was ignored for :class:`CategoricalDtype` (:issue:`59938`)
10361037
- Bug in :func:`bdate_range` raising ``ValueError`` with frequency ``freq="cbh"`` (:issue:`62849`)
10371038
- Bug in :func:`testing.assert_index_equal` raising ``TypeError`` instead of ``AssertionError`` for incomparable ``CategoricalIndex`` when ``check_categorical=True`` and ``exact=False`` (:issue:`61935`)
10381039
- Bug in :meth:`Categorical.astype` where ``copy=False`` would still trigger a copy of the codes (:issue:`62000`)
10391040
- Bug in :meth:`DataFrame.pivot` and :meth:`DataFrame.set_index` raising an ``ArrowNotImplementedError`` for columns with pyarrow dictionary dtype (:issue:`53051`)
10401041
- Bug in :meth:`Series.convert_dtypes` with ``dtype_backend="pyarrow"`` where empty :class:`CategoricalDtype` :class:`Series` raised an error or got converted to ``null[pyarrow]`` (:issue:`59934`)
1041-
-
10421042

10431043
Datetimelike
10441044
^^^^^^^^^^^^
@@ -1132,7 +1132,6 @@ Interval
11321132

11331133
Indexing
11341134
^^^^^^^^
1135-
- Bug in :meth:`DataFrame.__getitem__` returning modified columns when called with ``slice`` in Python 3.12 (:issue:`57500`)
11361135
- Bug in :meth:`DataFrame.__getitem__` when slicing a :class:`DataFrame` with many rows raised an ``OverflowError`` (:issue:`59531`)
11371136
- Bug in :meth:`DataFrame.__setitem__` on an empty :class:`DataFrame` with a tuple corrupting the frame (:issue:`54385`)
11381137
- Bug in :meth:`DataFrame.from_records` throwing a ``ValueError`` when passed an empty list in ``index`` (:issue:`58594`)
@@ -1260,6 +1259,7 @@ Groupby/resample/rolling
12601259
- Bug in :meth:`Rolling.skew` incorrectly computing skewness for windows following outliers due to numerical instability. The calculation now properly handles catastrophic cancellation by recomputing affected windows (:issue:`47461`)
12611260
- Bug in :meth:`Series.resample` could raise when the date range ended shortly before a non-existent time. (:issue:`58380`)
12621261
- Bug in :meth:`Series.resample` raising error when resampling non-nanosecond resolutions out of bounds for nanosecond precision (:issue:`57427`)
1262+
- Bug in :meth:`Series.rolling.var` and :meth:`Series.rolling.std` computing incorrect results due to numerical instability. (:issue:`47721`, :issue:`52407`, :issue:`54518`, :issue:`55343`)
12631263

12641264
Reshaping
12651265
^^^^^^^^^
@@ -1299,6 +1299,7 @@ ExtensionArray
12991299
- Bug in :class:`Categorical` when constructing with an :class:`Index` with :class:`ArrowDtype` (:issue:`60563`)
13001300
- Bug in :meth:`.arrays.ArrowExtensionArray.__setitem__` which caused wrong behavior when using an integer array with repeated values as a key (:issue:`58530`)
13011301
- Bug in :meth:`ArrowExtensionArray.factorize` where NA values were dropped when input was dictionary-encoded even when dropna was set to False(:issue:`60567`)
1302+
- Bug in :meth:`NDArrayBackedExtensionArray.take` which produced arrays whose dtypes didn't match their underlying data, when called with integer arrays (:issue:`62448`)
13021303
- Bug in :meth:`api.types.is_datetime64_any_dtype` where a custom :class:`ExtensionDtype` would return ``False`` for array-likes (:issue:`57055`)
13031304
- Bug in comparison between object with :class:`ArrowDtype` and incompatible-dtyped (e.g. string vs bool) incorrectly raising instead of returning all-``False`` (for ``==``) or all-``True`` (for ``!=``) (:issue:`59505`)
13041305
- Bug in constructing pandas data structures when passing into ``dtype`` a string of the type followed by ``[pyarrow]`` while PyArrow is not installed would raise ``NameError`` rather than ``ImportError`` (:issue:`57928`)

pandas/_libs/internals.pyi

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,3 +94,7 @@ class BlockValuesRefs:
9494
def add_reference(self, blk: Block) -> None: ...
9595
def add_index_reference(self, index: Index) -> None: ...
9696
def has_reference(self) -> bool: ...
97+
98+
class SetitemMixin:
99+
def __setitem__(self, key, value) -> None: ...
100+
def __delitem__(self, key) -> None: ...

pandas/_libs/internals.pyx

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
from collections import defaultdict
2+
import sys
3+
import warnings
24

35
cimport cython
6+
from cpython cimport PY_VERSION_HEX
47
from cpython.object cimport PyObject
58
from cpython.pyport cimport PY_SSIZE_T_MAX
69
from cpython.slice cimport PySlice_GetIndicesEx
@@ -20,6 +23,9 @@ from numpy cimport (
2023
cnp.import_array()
2124

2225
from pandas._libs.algos import ensure_int64
26+
from pandas.compat import CHAINED_WARNING_DISABLED
27+
from pandas.errors import ChainedAssignmentError
28+
from pandas.errors.cow import _chained_assignment_msg
2329

2430
from pandas._libs.util cimport (
2531
is_array,
@@ -996,3 +1002,43 @@ cdef class BlockValuesRefs:
9961002
return self._has_reference_maybe_locked()
9971003
ELSE:
9981004
return self._has_reference_maybe_locked()
1005+
1006+
1007+
cdef extern from "Python.h":
1008+
"""
1009+
#if PY_VERSION_HEX < 0x030E0000
1010+
int __Pyx_PyUnstable_Object_IsUniqueReferencedTemporary(PyObject *ref);
1011+
#else
1012+
#define __Pyx_PyUnstable_Object_IsUniqueReferencedTemporary \
1013+
PyUnstable_Object_IsUniqueReferencedTemporary
1014+
#endif
1015+
"""
1016+
int PyUnstable_Object_IsUniqueReferencedTemporary\
1017+
"__Pyx_PyUnstable_Object_IsUniqueReferencedTemporary"(object o) except -1
1018+
1019+
1020+
# Python version compatibility for PyUnstable_Object_IsUniqueReferencedTemporary
1021+
cdef inline bint _is_unique_referenced_temporary(object obj) except -1:
1022+
if PY_VERSION_HEX >= 0x030E0000:
1023+
# Python 3.14+ has PyUnstable_Object_IsUniqueReferencedTemporary
1024+
return PyUnstable_Object_IsUniqueReferencedTemporary(obj)
1025+
else:
1026+
# Fallback for older Python versions using sys.getrefcount
1027+
return sys.getrefcount(obj) <= 1
1028+
1029+
1030+
cdef class SetitemMixin:
1031+
# class used in DataFrame and Series for checking for chained assignment
1032+
1033+
def __setitem__(self, key, value) -> None:
1034+
cdef bint is_unique = 0
1035+
if not CHAINED_WARNING_DISABLED:
1036+
is_unique = _is_unique_referenced_temporary(self)
1037+
if is_unique:
1038+
warnings.warn(
1039+
_chained_assignment_msg, ChainedAssignmentError, stacklevel=1
1040+
)
1041+
self._setitem(key, value)
1042+
1043+
def __delitem__(self, key) -> None:
1044+
self._delitem(key)

pandas/_libs/lib.pyx

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,7 @@ def item_from_zerodim(val: object) -> object:
322322
>>> item_from_zerodim(np.array([1]))
323323
array([1])
324324
"""
325-
if cnp.PyArray_IsZeroDim(val):
325+
if cnp.PyArray_IsZeroDim(val) and cnp.PyArray_CheckExact(val):
326326
return cnp.PyArray_ToScalar(cnp.PyArray_DATA(val), val)
327327
return val
328328

@@ -2593,7 +2593,7 @@ def maybe_convert_objects(ndarray[object] objects,
25932593
Whether to convert numeric entries.
25942594
convert_to_nullable_dtype : bool, default False
25952595
If an array-like object contains only integer or boolean values (and NaN) is
2596-
encountered, whether to convert and return an Boolean/IntegerArray.
2596+
encountered, whether to convert and return a Boolean/IntegerArray.
25972597
convert_non_numeric : bool, default False
25982598
Whether to convert datetime, timedelta, period, interval types.
25992599
dtype_if_all_nat : np.dtype, ExtensionDtype, or None, default None
@@ -2716,18 +2716,16 @@ def maybe_convert_objects(ndarray[object] objects,
27162716
if convert_non_numeric:
27172717
if getattr(val, "tzinfo", None) is not None:
27182718
seen.datetimetz_ = True
2719-
break
27202719
else:
27212720
seen.datetime_ = True
27222721
try:
27232722
convert_to_tsobject(val, None, None, 0, 0)
27242723
except OutOfBoundsDatetime:
27252724
# e.g. test_out_of_s_bounds_datetime64
27262725
seen.object_ = True
2727-
break
27282726
else:
27292727
seen.object_ = True
2730-
break
2728+
break
27312729
elif is_period_object(val):
27322730
if convert_non_numeric:
27332731
seen.period_ = True

pandas/_libs/tslibs/fields.pyx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ def get_date_name_field(
146146
NPY_DATETIMEUNIT reso=NPY_FR_ns,
147147
):
148148
"""
149-
Given a int64-based datetime index, return array of strings of date
149+
Given an int64-based datetime index, return array of strings of date
150150
name based on requested field (e.g. day_name)
151151
"""
152152
cdef:
@@ -335,7 +335,7 @@ def get_date_field(
335335
NPY_DATETIMEUNIT reso=NPY_FR_ns,
336336
):
337337
"""
338-
Given a int64-based datetime index, extract the year, month, etc.,
338+
Given an int64-based datetime index, extract the year, month, etc.,
339339
field and return an array of these values.
340340
"""
341341
cdef:
@@ -502,7 +502,7 @@ def get_timedelta_field(
502502
NPY_DATETIMEUNIT reso=NPY_FR_ns,
503503
):
504504
"""
505-
Given a int64-based timedelta index, extract the days, hrs, sec.,
505+
Given an int64-based timedelta index, extract the days, hrs, sec.,
506506
field and return an array of these values.
507507
"""
508508
cdef:
@@ -555,7 +555,7 @@ def get_timedelta_days(
555555
NPY_DATETIMEUNIT reso=NPY_FR_ns,
556556
):
557557
"""
558-
Given a int64-based timedelta index, extract the days,
558+
Given an int64-based timedelta index, extract the days,
559559
field and return an array of these values.
560560
"""
561561
cdef:
@@ -592,7 +592,7 @@ cpdef isleapyear_arr(ndarray years):
592592
@cython.boundscheck(False)
593593
def build_isocalendar_sarray(const int64_t[:] dtindex, NPY_DATETIMEUNIT reso):
594594
"""
595-
Given a int64-based datetime array, return the ISO 8601 year, week, and day
595+
Given an int64-based datetime array, return the ISO 8601 year, week, and day
596596
as a structured array.
597597
"""
598598
cdef:

0 commit comments

Comments
 (0)