2014-12-19 5 views
3

커다란하지만 매우 드문 드문 행렬 (50,000 개의 행 * 100,000 개의 열, 값의 10 % 만 알려져 있음)이 있습니다. 이 행렬의 알려진 각 요소는 0.00에서 1.00로 플로트 번호 이러한 공지 된 값과 같은 형식 파이썬 딕셔너리에 저장되어dict에서 크고 드문 드문 데이터 프레임을 효과적으로 만드는 방법은 무엇입니까?

{'c1': {'r1':0.27, 'r3':0.45}, 
'c2': {'r2':0.65, 'r4':0.87} } 

지금 문제점이 딕셔너리로부터 pandas.DataFrame을 구성하는 방법이며 효율적으로? 여기서 효율성에는 메모리 사용과 데이터 프레임 구성 시간이 모두 포함됩니다.

메모리 사용의 경우 각 요소를 np.uint8로 저장하려고합니다. 알려진 값은 0.00에서 1.00까지이며 첫 번째 2 자리 만 처리하므로 100을 곱하여 부호없는 8 비트 정수로 변환 할 수 있습니다. 이렇게하면이 데이터 프레임에 대한 많은 메모리를 절약 할 수 있습니다.

이렇게 할 방법이 있습니까?

+0

중복 가능성 [A DataFrame 작성시 누락 값을 채우는 방법?] (http://stackoverflow.com/questions/27559409/how-to-fill-the-missing-value-when-constructing-a-dataframe) – aerokite

+1

여기 내 도움이 도움이 될 수 있습니다. http : // stackoverflow. com/questions/27160867/효율적 - 생성 - 희소성 - 인접성 - 행렬 있음 – nicolaskruchten

답변

1

dict 같은

{'c1': {'r1':0.27, 'r3':0.45}, 
'c2': {'r2':0.65, 'r4':0.87} } 

... 최상의 같이 정규화 된 구조로 변환된다 :

level0 level1 value 
c1  r1  0.27 
c1  r3  0.45 
c2  r2  0.65 
c2  r4  0.87 

을 ... 피봇 테이블 이상이 같은

 r1 r2 r3 r4 
c1 0.27 nan 0.45 nan 
c2 nan 0.65 nan 0.87 

... 후자는 더 많은 메모리를 필요로하기 때문에.

정규화 구조를 구성 합리적 메모리 효율적인 방법이다 :이 결과

input = {'c1': {'r1':0.27, 'r3':0.45}, 
     'c2': {'r2':0.65, 'r4':0.87} } 

result = [] 
for key, value in input.iteritems(): 
    row = pd.Series(value).reset_index() 
    row.insert(0, 'key', key) 
    result.append(row) 

pd.concat(result, ignore_index=True) 

:의

key index  0 
0 c2 r2 0.65 
1 c2 r4 0.87 
2 c1 r1 0.27 
3 c1 r3 0.45 
관련 문제