2016-10-28 4 views
1

я прочитал случайное подмножество строк из таблицы HDF с помощью следующего кода Python/панды:Python Read hdf5 Ряды Где Индекс Не в списке

hdf_store = pd.HDFStore('path_to_data.h5') 
total_rows = hdf_store.get_storer('hdf_table_name').nrows 

num_rows = int(total_rows * .25) 
row_indices = np.random.randint(0,rows_indices,size=num_rows) 

my_df = pd.read_hdf(hdf_store, 'hdf_table_name', where=pd.Index(row_indices)) 

Позже в программе, я хотел бы вытащить остальные строк данных из таблицы HDF5. Но следующие ошибки:

rest_of_rows = pd.read_hdf(hdf_store, 'hdf_table_name', 
    where=pd.Index(not in (row_indices))) 

rest_of_rows = pd.read_hdf(hdf_store, 'hdf_table_name', 
    where=not pd.Index(row_indices)) 

Есть ли способ вытащить строки HDF по записям, не входящим в список индексов?

Поскольку таблица больше, чем моя оперативная память, я бы хотел, чтобы вы не вытащили все строки из HDF (даже в кусках), а затем разделили его на одновременное удерживание обеих таблиц. Я мог отображать индексы в другой столбец и подмножество строк, не отображаемых в сопоставленном значении этого столбца. Но это, вероятно, будет намного медленнее, чем запрос по индексу напрямую.

ответ

1

Вы можете использовать метод Index.difference.

Демо:

# randomly select 25% of index elements (without duplicates `replace=False`) 
sample_idx = np.random.choice(np.arange(total_rows), total_rows//4, replace=False) 

# select remaining index elements 
rest_idx = pd.Index(np.arange(total_rows)).difference(sample_idx) 

# get rest rows by index 
rest = store.select('hdf_table_name', where=rest_idx) 

PS При желании вы можете выбрать остальную часть строк в куски ...