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)) 

안양 스파 스되지 않습니다,하지만 필터링 결과 마스크는 스파 스입니다.

마스크를 전체 부울로 저장하면 큰 데이터 프레임 (50mio 행 * 100columns)이있을 때 많은 메모리를 사용합니다. 마스크 결과 (0.1 %가 TRUE 인) 매우 희박한로

그래서 궁금

찾을 수 없습니다 ... 메모리로드를 감소시키기 위해서 대신에 어레이 마스크 희소 부울 마스크를 사용하는 방법이 있다면 어떤 해결책도 팬더에 이미 드문 드문 배열입니다. 마스크 보관 및 사용에이 방법을 사용하는 방법이 명확하지 않기 때문에. 즉

mask_sparse = pd.SparseArray(mask) 

편집 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

스파 스 데이터 프레임을 쉽게 만들 수 있습니다. 그러나 하나의 주요한 잡았다가있다!

# 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 

이의 아무것도하지 않았다,

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

80000080 

흠 sparsify 해보자 다음 dataframe df 및 메모리 풋 프린트를 생각해 보자. 왜냐하면 우리는 대다수의 장소 소유자 인 객체를 지정해야하기 때문입니다. 의는

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, 이것은 스파 스가 아닌 데이터 프레임 df 자체는 아니지만 드문 드문 필터링 결과 인 부울 마스크입니다. – deepmind27

+0

@ deepmind27이 아이디어를'mask'에 적용합니다. 'mask = mask.to_sparse (False) ' – piRSquared

+0

이 마스크는 어떻게 사용합니까? – hpaulj

관련 문제