diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index b08be80dcb16a..f7f7be6c7a321 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -860,7 +860,7 @@ def remove(self, key, where=None, start=None, stop=None): raise KeyError('No object named %s in the file' % key) # remove the node - if where is None: + if where is None and start is None and stop is None: s.group._f_remove(recursive=True) # delete from the table @@ -2139,11 +2139,9 @@ def write(self, **kwargs): raise NotImplementedError( "cannot write on an abstract storer: sublcasses should implement") - def delete(self, where=None, **kwargs): - """support fully deleting the node in its entirety (only) - where - specification must be None - """ - if where is None: + def delete(self, where=None, start=None, stop=None, **kwargs): + """ support fully deleting the node in its entirety (only) - where specification must be None """ + if where is None and start is None and stop is None: self._handle.removeNode(self.group, recursive=True) return None @@ -3700,12 +3698,16 @@ def write_data_chunk(self, indexes, mask, values): except Exception as detail: raise TypeError("tables cannot write this data -> %s" % detail) - def delete(self, where=None, **kwargs): + def delete(self, where=None, start=None, stop=None, **kwargs): # delete all rows (and return the nrows) if where is None or not len(where): - nrows = self.nrows - self._handle.removeNode(self.group, recursive=True) + if start is None and stop is None: + nrows = self.nrows + self._handle.removeNode(self.group, recursive=True) + else: + nrows = self.table.removeRows(start=start, stop=stop) + self.table.flush() return nrows # infer the data kind @@ -3714,7 +3716,7 @@ def delete(self, where=None, **kwargs): # create the selection table = self.table - self.selection = Selection(self, where, **kwargs) + self.selection = Selection(self, where, start=start, stop=stop, **kwargs) values = self.selection.select_coords() # delete the rows in reverse order @@ -4297,7 +4299,7 @@ def select_coords(self): generate the selection """ if self.condition is None: - return np.arange(self.table.nrows) + return np.arange(0, self.table.nrows)[self.start:self.stop] return self.table.table.getWhereList(self.condition.format(), start=self.start, stop=self.stop, diff --git a/pandas/io/tests/test_pytables.py b/pandas/io/tests/test_pytables.py index f7d01cb1bec96..51e38bdab4469 100644 --- a/pandas/io/tests/test_pytables.py +++ b/pandas/io/tests/test_pytables.py @@ -2158,6 +2158,68 @@ def test_remove_where(self): # self.assertRaises(ValueError, store.remove, # 'wp2', [('column', ['A', 'D'])]) + def test_remove_startstop(self): + + with ensure_clean_store(self.path) as store: + + wp = tm.makePanel() + + # start + store.put('wp1', wp, format='t') + n = store.remove('wp1', start=32) + assert(n == 120-32) + result = store.select('wp1') + expected = wp.reindex(major_axis=wp.major_axis[:32//4]) + assert_panel_equal(result, expected) + + store.put('wp2', wp, format='t') + n = store.remove('wp2', start=-32) + assert(n == 32) + result = store.select('wp2') + expected = wp.reindex(major_axis=wp.major_axis[:-32//4]) + assert_panel_equal(result, expected) + + # stop + store.put('wp3', wp, format='t') + n = store.remove('wp3', stop=32) + assert(n == 32) + result = store.select('wp3') + expected = wp.reindex(major_axis=wp.major_axis[32//4:]) + assert_panel_equal(result, expected) + + store.put('wp4', wp, format='t') + n = store.remove('wp4', stop=-32) + assert(n == 120-32) + result = store.select('wp4') + expected = wp.reindex(major_axis=wp.major_axis[-32//4:]) + assert_panel_equal(result, expected) + + # start n stop + store.put('wp5', wp, format='t') + n = store.remove('wp5', start=16, stop=-16) + assert(n == 120-32) + result = store.select('wp5') + expected = wp.reindex(major_axis=wp.major_axis[:16//4]+wp.major_axis[-16//4:]) + assert_panel_equal(result, expected) + + store.put('wp6', wp, format='t') + n = store.remove('wp6', start=16, stop=16) + assert(n == 0) + result = store.select('wp6') + expected = wp.reindex(major_axis=wp.major_axis) + assert_panel_equal(result, expected) + + # with where + date = wp.major_axis.take(np.arange(0,30,3)) + crit = Term('major_axis=date') + store.put('wp7', wp, format='t') + n = store.remove('wp7', where=[crit], stop=80) + assert(n == 28) + result = store.select('wp7') + expected = wp.reindex(major_axis=wp.major_axis-wp.major_axis[np.arange(0,20,3)]) + assert_panel_equal(result, expected) + + def test_remove_crit(self): with ensure_clean_store(self.path) as store: