From 9e4765f618e1e79e4f292713555679d970051fa9 Mon Sep 17 00:00:00 2001 From: jreback Date: Mon, 18 Nov 2013 19:59:51 -0500 Subject: [PATCH] BUG: Bug in delitem on a Series (GH5542) --- doc/source/release.rst | 1 + pandas/core/internals.py | 28 +++++++++++++++------------- pandas/tests/test_series.py | 29 +++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 13 deletions(-) diff --git a/doc/source/release.rst b/doc/source/release.rst index 8d39db39ad4a6..4a4726c78a677 100644 --- a/doc/source/release.rst +++ b/doc/source/release.rst @@ -809,6 +809,7 @@ Bug Fixes - Fixed various setitem with 1d ndarray that does not have a matching length to the indexer (:issue:`5508`) - Bug in getitem with a multi-index and ``iloc`` (:issue:`5528`) + - Bug in delitem on a Series (:issue:`5542`) pandas 0.12.0 ------------- diff --git a/pandas/core/internals.py b/pandas/core/internals.py index 44a18ef3043b3..79667ecddc8a6 100644 --- a/pandas/core/internals.py +++ b/pandas/core/internals.py @@ -1969,7 +1969,7 @@ def ndim(self): self._ndim = len(self.axes) return self._ndim - def set_axis(self, axis, value, maybe_rename=True, check_axis=True): + def _set_axis(self, axis, value, check_axis=True): cur_axis = self.axes[axis] value = _ensure_index(value) @@ -1980,6 +1980,10 @@ def set_axis(self, axis, value, maybe_rename=True, check_axis=True): self.axes[axis] = value self._shape = None + return cur_axis, value + + def set_axis(self, axis, value, maybe_rename=True, check_axis=True): + cur_axis, value = self._set_axis(axis, value, check_axis) if axis == 0: @@ -3473,24 +3477,22 @@ def reindex_axis0_with_method(self, new_axis, indexer=None, method=None, return self.reindex(new_axis, indexer=indexer, method=method, fill_value=fill_value, limit=limit, copy=copy) + def _delete_from_block(self, i, item): + super(SingleBlockManager, self)._delete_from_block(i, item) + + # reset our state + self._block = self.blocks[0] if len(self.blocks) else make_block(np.array([],dtype=self._block.dtype),[],[]) + self._values = self._block.values + def get_slice(self, slobj, raise_on_error=False): if raise_on_error: _check_slice_bounds(slobj, self.index) return self.__class__(self._block._slice(slobj), self.index._getitem_slice(slobj), fastpath=True) - def set_axis(self, axis, value): - cur_axis = self.axes[axis] - value = _ensure_index(value) - - if len(value) != len(cur_axis): - raise ValueError('Length mismatch: Expected axis has %d elements, ' - 'new values have %d elements' % (len(cur_axis), - len(value))) - - self.axes[axis] = value - self._shape = None - self._block.set_ref_items(self.items, maybe_rename=True) + def set_axis(self, axis, value, maybe_rename=True, check_axis=True): + cur_axis, value = self._set_axis(axis, value, check_axis) + self._block.set_ref_items(self.items, maybe_rename=maybe_rename) def set_ref_items(self, ref_items, maybe_rename=True): """ we can optimize and our ref_locs are always equal to ref_items """ diff --git a/pandas/tests/test_series.py b/pandas/tests/test_series.py index b6f0387835c22..c44ede057adb2 100644 --- a/pandas/tests/test_series.py +++ b/pandas/tests/test_series.py @@ -113,6 +113,35 @@ def test_combine_first_dt64(self): xp = Series([datetime(2010, 1, 1), '2011']) assert_series_equal(rs, xp) + def test_delitem(self): + + # GH 5542 + # should delete the item inplace + s = Series(lrange(5)) + del s[0] + + expected = Series(lrange(1,5),index=lrange(1,5)) + assert_series_equal(s, expected) + + del s[1] + expected = Series(lrange(2,5),index=lrange(2,5)) + assert_series_equal(s, expected) + + # empty + s = Series() + def f(): + del s[0] + self.assertRaises(KeyError, f) + + # only 1 left, del, add, del + s = Series(1) + del s[0] + assert_series_equal(s, Series(dtype='int64')) + s[0] = 1 + assert_series_equal(s, Series(1)) + del s[0] + assert_series_equal(s, Series(dtype='int64')) + def test_getitem_preserve_name(self): result = self.ts[self.ts > 0] self.assertEquals(result.name, self.ts.name)