Skip to content

Commit 93f75b3

Browse files
committed
ENH: allow index recreation by calling create_table_index with new parameters
1 parent 0419514 commit 93f75b3

File tree

2 files changed

+39
-5
lines changed

2 files changed

+39
-5
lines changed

pandas/io/pytables.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1325,8 +1325,27 @@ def create_index(self, columns = None, optlevel = None, kind = None):
13251325
table = self.table
13261326
for c in columns:
13271327
v = getattr(table.cols,c,None)
1328-
if v is not None and not v.is_indexed:
1329-
v.createIndex(**kw)
1328+
if v is not None:
1329+
1330+
# remove the index if the kind/optlevel have changed
1331+
if v.is_indexed:
1332+
index = v.index
1333+
cur_optlevel = index.optlevel
1334+
cur_kind = index.kind
1335+
1336+
if kind is not None and cur_kind != kind:
1337+
v.removeIndex()
1338+
else:
1339+
kw['kind'] = cur_kind
1340+
1341+
if optlevel is not None and cur_optlevel != optlevel:
1342+
v.removeIndex()
1343+
else:
1344+
kw['optlevel'] = cur_optlevel
1345+
1346+
# create the index
1347+
if not v.is_indexed:
1348+
v.createIndex(**kw)
13301349

13311350
def read_axes(self, where):
13321351
""" create and return the axes sniffed from the table: return boolean for success """

pandas/io/tests/test_pytables.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -381,14 +381,29 @@ def test_create_table_index(self):
381381
assert(self.store.handle.root.p5.table.cols.major_axis.is_indexed == True)
382382
assert(self.store.handle.root.p5.table.cols.minor_axis.is_indexed == False)
383383

384+
# default optlevels
385+
assert(self.store.handle.root.p5.table.cols.major_axis.index.optlevel == 6)
386+
assert(self.store.handle.root.p5.table.cols.major_axis.index.kind == 'medium')
387+
388+
# let's change the indexing scheme
389+
self.store.create_table_index('p5')
390+
assert(self.store.handle.root.p5.table.cols.major_axis.index.optlevel == 6)
391+
assert(self.store.handle.root.p5.table.cols.major_axis.index.kind == 'medium')
392+
self.store.create_table_index('p5', optlevel=9)
393+
assert(self.store.handle.root.p5.table.cols.major_axis.index.optlevel == 9)
394+
assert(self.store.handle.root.p5.table.cols.major_axis.index.kind == 'medium')
395+
self.store.create_table_index('p5', kind='full')
396+
assert(self.store.handle.root.p5.table.cols.major_axis.index.optlevel == 9)
397+
assert(self.store.handle.root.p5.table.cols.major_axis.index.kind == 'full')
398+
self.store.create_table_index('p5', optlevel=1, kind='light')
399+
assert(self.store.handle.root.p5.table.cols.major_axis.index.optlevel == 1)
400+
assert(self.store.handle.root.p5.table.cols.major_axis.index.kind == 'light')
401+
384402
df = tm.makeTimeDataFrame()
385403
self.store.append('f', df[:10])
386404
self.store.append('f', df[10:])
387405
self.store.create_table_index('f')
388406

389-
# create twice
390-
self.store.create_table_index('f')
391-
392407
# try to index a non-table
393408
self.store.put('f2', df)
394409
self.assertRaises(Exception, self.store.create_table_index, 'f2')

0 commit comments

Comments
 (0)