Skip to content

Commit 640ba00

Browse files
committed
Merge pull request #5892 from jreback/mi_setitem
BUG: Bug in internal caching, related to (GH5727)
2 parents 20dace8 + e3fb2f6 commit 640ba00

File tree

3 files changed

+23
-8
lines changed

3 files changed

+23
-8
lines changed

doc/source/release.rst

+1
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ Bug Fixes
8282
- Bug in ``to_datetime`` when passed a ``np.nan`` or integer datelike and a format string (:issue:`5863`)
8383
- Bug in groupby dtype conversion with datetimelike (:issue:`5869`)
8484
- Regresssion in handling of empty Series as indexers to Series (:issue:`5877`)
85+
- Bug in internal caching, related to (:issue:`5727`)
8586

8687
pandas 0.13.0
8788
-------------

pandas/core/generic.py

+16-8
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ class NDFrame(PandasObject):
7777
axes : list
7878
copy : boolean, default False
7979
"""
80-
_internal_names = ['_data', 'name', '_cacher', 'is_copy', '_subtyp',
81-
'_index', '_default_kind', '_default_fill_value']
80+
_internal_names = ['_data', '_cacher', '_item_cache', '_cache',
81+
'is_copy', '_subtyp', '_index', '_default_kind', '_default_fill_value']
8282
_internal_names_set = set(_internal_names)
8383
_metadata = []
8484
is_copy = None
@@ -721,13 +721,14 @@ def __setstate__(self, state):
721721
# to avoid definitional recursion
722722
# e.g. say fill_value needing _data to be
723723
# defined
724-
for k in self._internal_names_set:
724+
meta = set(self._internal_names + self._metadata)
725+
for k in list(meta):
725726
if k in state:
726727
v = state[k]
727728
object.__setattr__(self, k, v)
728729

729730
for k, v in state.items():
730-
if k not in self._internal_names_set:
731+
if k not in meta:
731732
object.__setattr__(self, k, v)
732733

733734
else:
@@ -1607,16 +1608,23 @@ def __getattr__(self, name):
16071608
16081609
This allows simpler access to columns for interactive use.
16091610
"""
1610-
if name in self._info_axis:
1611-
return self[name]
1612-
raise AttributeError("'%s' object has no attribute '%s'" %
1613-
(type(self).__name__, name))
1611+
if name in self._internal_names_set:
1612+
return object.__getattribute__(self, name)
1613+
elif name in self._metadata:
1614+
return object.__getattribute__(self, name)
1615+
else:
1616+
if name in self._info_axis:
1617+
return self[name]
1618+
raise AttributeError("'%s' object has no attribute '%s'" %
1619+
(type(self).__name__, name))
16141620

16151621
def __setattr__(self, name, value):
16161622
"""After regular attribute access, try looking up the name of the info
16171623
This allows simpler access to columns for interactive use."""
16181624
if name in self._internal_names_set:
16191625
object.__setattr__(self, name, value)
1626+
elif name in self._metadata:
1627+
return object.__setattr__(self, name, value)
16201628
else:
16211629
try:
16221630
existing = getattr(self, name)

pandas/tests/test_indexing.py

+6
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,12 @@ def test_indexer_caching(self):
258258
s = Series(np.zeros(n), index=index)
259259
str(s)
260260

261+
# setitem
262+
expected = Series(np.ones(n), index=index)
263+
s = Series(np.zeros(n), index=index)
264+
s[s==0] = 1
265+
assert_series_equal(s,expected)
266+
261267
def test_at_and_iat_get(self):
262268

263269
def _check(f, func, values = False):

0 commit comments

Comments
 (0)