Skip to content

Commit 6ce9be6

Browse files
authored
BUG: item_cache invalidation (#38351)
1 parent d3e970b commit 6ce9be6

File tree

4 files changed

+30
-7
lines changed

4 files changed

+30
-7
lines changed

doc/source/whatsnew/v1.3.0.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ Timezones
104104

105105
Numeric
106106
^^^^^^^
107-
107+
- Bug in :meth:`DataFrame.quantile`, :meth:`DataFrame.sort_values` causing incorrect subsequent indexing behavior (:issue:`38351`)
108108
-
109109
-
110110

pandas/core/internals/managers.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,6 @@ def apply(
442442
def quantile(
443443
self,
444444
axis: int = 0,
445-
consolidate: bool = True,
446445
transposed: bool = False,
447446
interpolation="linear",
448447
qs=None,
@@ -472,9 +471,6 @@ def quantile(
472471
# simplify some of the code here and in the blocks
473472
assert self.ndim >= 2
474473

475-
if consolidate:
476-
self._consolidate_inplace()
477-
478474
def get_axe(block, qs, axes):
479475
# Because Series dispatches to DataFrame, we will always have
480476
# block.ndim == 2
@@ -1455,7 +1451,6 @@ def take(self, indexer, axis: int = 1, verify: bool = True, convert: bool = True
14551451
"""
14561452
Take items along any axis.
14571453
"""
1458-
self._consolidate_inplace()
14591454
indexer = (
14601455
np.arange(indexer.start, indexer.stop, indexer.step, dtype="int64")
14611456
if isinstance(indexer, slice)
@@ -1472,7 +1467,11 @@ def take(self, indexer, axis: int = 1, verify: bool = True, convert: bool = True
14721467

14731468
new_labels = self.axes[axis].take(indexer)
14741469
return self.reindex_indexer(
1475-
new_axis=new_labels, indexer=indexer, axis=axis, allow_dups=True
1470+
new_axis=new_labels,
1471+
indexer=indexer,
1472+
axis=axis,
1473+
allow_dups=True,
1474+
consolidate=False,
14761475
)
14771476

14781477
def equals(self, other: object) -> bool:

pandas/tests/frame/methods/test_quantile.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,3 +517,15 @@ def test_quantile_empty_no_columns(self):
517517
expected = DataFrame([], index=[0.5], columns=[])
518518
expected.columns.name = "captain tightpants"
519519
tm.assert_frame_equal(result, expected)
520+
521+
def test_quantile_item_cache(self):
522+
# previous behavior incorrect retained an invalid _item_cache entry
523+
df = DataFrame(np.random.randn(4, 3), columns=["A", "B", "C"])
524+
df["D"] = df["A"] * 2
525+
ser = df["A"]
526+
assert len(df._mgr.blocks) == 2
527+
528+
df.quantile(numeric_only=False)
529+
ser.values[0] = 99
530+
531+
assert df.iloc[0, 0] == df["A"][0]

pandas/tests/frame/methods/test_sort_values.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,18 @@ def test_sort_values_nat_na_position_default(self):
544544
result = expected.sort_values(["A", "date"])
545545
tm.assert_frame_equal(result, expected)
546546

547+
def test_sort_values_item_cache(self):
548+
# previous behavior incorrect retained an invalid _item_cache entry
549+
df = DataFrame(np.random.randn(4, 3), columns=["A", "B", "C"])
550+
df["D"] = df["A"] * 2
551+
ser = df["A"]
552+
assert len(df._mgr.blocks) == 2
553+
554+
df.sort_values(by="A")
555+
ser.values[0] = 99
556+
557+
assert df.iloc[0, 0] == df["A"][0]
558+
547559

548560
class TestDataFrameSortKey: # test key sorting (issue 27237)
549561
def test_sort_values_inplace_key(self, sort_by_key):

0 commit comments

Comments
 (0)