Я предполагаю, что это можно сделать с помощью "ptrepack". К сожалению, я не знаю, как заставить работать сортировку.
Как указать аргументы сортировки ("--sortby = index", "--checkCSI")
Пример:
from subprocess import call
from os import rename, remove
file_name = 'my_file.h5'
# create dataframe
df = pd.DataFrame({'id': ['A','C','C','B','A','B'],
'id_no': [3,2,1,4,5,6],
'value': [100,200,300,400,500,600]},
).set_index(['id','id_no'])
# create hdf store
store = pd.HDFStore(file_name, mode='a', complib='blosc',complevel=9)
store['my_table'] = df
store.close()
# repack the file & sort it by index columns
command = ["ptrepack", "-o", "--chunkshape=auto",
#"--sortby=index", "--checkCSI",
"--propindexes", "--complevel=9", "--complib=blosc",
file_name+':', file_name[:-3]+'_tmp.h5:']
if call(command) != 0:
print('ptrepack failed - file could not be repacked')
else:
remove(file_name)
rename(file_name[:-3]+'_tmp.h5', file_name)
# expected result
print(df.sort_index(level=df.index.names))
Внешний вид несортированного хранилища HDFнапример:
value
id id_no
A 3 100
C 2 200
1 300
B 4 400
A 5 500
B 6 600
Отсортированное хранилище HDF должно быть:
value
id id_no
A 3 100
5 500
B 4 400
6 600
C 1 300
2 200
Каков наилучший способ сортировки существующего хранилища HDF по мультииндексу?