2017-01-11 2 views
2

У меня есть следующий код для маски фильтрации ДФА:Как создать разреженную булевую маску в Пандах?

for i, y in enumerate(cols) : 
    dfm = df[y].str.contains(s) 
    mask= dfm if i==0 else np.column_stack((mask, dfm)) 

DF не является редким, но маска результаты фильтрации является редкой.

Хранение маски в полном булевом режиме требует большого объема памяти при наличии большого кадра данных (50mi rows * 100columns).

Так что, как результат маски очень скуден (0,1% ИСТИНА), интересно, если есть способ использовать редкую булеву маску вместо маски массива для того, чтобы снизить нагрузку на память ...

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

mask_sparse = pd.SparseArray(mask) 

EDIT 2: Разъяснение вопроса: Могут ли мы получить непосредственно фильтр результата маски в разреженный массив без манипулирования полного массива?

+0

Я очень смущен. Вам нужно приложить больше усилий для объяснения того, что у вас есть, чего хотите, и попробовали. прочитайте это, чтобы лучше понять, как максимально увеличить вероятность ответа на ваш вопрос ... [mcve] (http://stackoverflow.com/help/mcve) – piRSquared

+0

thx, я отредактировал мой вопрос, чтобы сделать его более понятным. – deepmind27

+0

http://stackoverflow.com/questions/36523861/can-pandas-sparseseries-store-values-in-the-float16-dtype - единственный вопрос, который я нахожу, который обсуждает 'pd.SparseArray'. Есть несколько других, которые занимаются разреженными кадрами данных или сериями. – hpaulj

ответ

0

Вы можете легко создавать разреженные dataframes. Но есть одна важная добыча!

Рассмотрим следующий dataframe df и его объем памяти

# 10,000 cells with 1% ones and 99% zeros 
df = pd.DataFrame(np.random.choice((0, 1), size=(10000, 1000), p=(.99, .01))) 
df.memory_usage().sum() 

80000080 

Давайте попробуем sparsify

df_sparse = df.to_sparse() 
df_sparse.memory_usage().sum() 

80000080 

Хммм, что ничего не делать. Это потому, что нам нужно указать объект, который является владельцем основного места. Давайте посмотрим

df_sparse_2 = df.to_sparse(1) 
df_sparse_2.memory_usage().sum() 

79196744 

И

df_sparse_3 = df.to_sparse(0) 
df_sparse_3.memory_usage().sum() 

803416 

Это лучше. Не забудьте указать значение держателя места.

+0

Thx, это не сам dataframe df, который не разрежен, а булевская маска, являющаяся результатом разреженной фильтрации. – deepmind27

+0

@ deepmind27 просто примените эту идею к 'mask'. 'mask = mask.to_sparse (False)' – piRSquared

+0

Как вы используете эту маску? – hpaulj

Смежные вопросы