2017-05-16 2 views
1

나는 100k 행의 여러 개의 작은 조각으로 분할하고 디스크에 저장하여 데이터를 읽고 처리 할 수 ​​있도록 팬더 데이터 프레임을 가지고 있습니다. CSV 및 원시 텍스트가 많은 시간이 걸리는 것처럼 보였으므로 dillhdf 저장 용량을 사용해 보았습니다.판다 데이터 프레임의 효율적인 읽기 및 쓰기

나는이 데이터를 ~ 500k 개의 행과 5 개의 혼합 데이터 열을 사용하여 데이터의 일부분에서 테스트하려고한다. 2 개는 문자열, 하나의 정수, 하나의 부동 소수점을 포함하며 마지막에는 sklearn.feature_extraction.text.CountVectorizer의 bigram 카운트가 포함되어 있으며 scipy.sparse.csr.csr_matrix 스파 스 매트릭스로 저장됩니다.

문제가있는 것은 마지막 열입니다. 데이터 덤프 및 로딩은 문제없이 진행되지만, 실제로 데이터에 액세스하려고하면 pandas.Series 객체가됩니다. 두 번째로, Series의 각 행은 대신 전체 데이터 세트를 포함하는 튜플입니다.

# Before dumping, the original df has 100k rows. 
# Each column has one value except for 'counts' which has 1400. 
# Meaning that df['counts'] give me a sparse matrix that is 100k x 1400. 

vectorizer = sklearn.feature_extraction.text.CountVectorizer(analyzer='char', ngram_range=(2,2)) 
counts = vectorizer.fit_transform(df['string_data']) 
df['counts'] = counts 

df_split = pandas.DataFrame(np.column_stack([df['string1'][0:100000], 
               df['string2'][0:100000], 
               df['float'][0:100000], 
               df['integer'][0:100000], 
               df['counts'][0:100000]]), 
               columns=['string1','string2','float','integer','counts']) 
dill.dump(df, open(file[i], 'w')) 

df = dill.load(file[i]) 
print(type(df['counts']) 
> <class 'pandas.core.series.Series'> 
print(np.shape(df['counts']) 
> (100000,) 
print(np.shape(df['counts'][0]) 
> (496718, 1400) # 496718 is the number of rows in my complete data set. 
print(type(df['counts'])) 
> <type 'tuple'> 

오전 나는 어떤 명백한 실수를하거나이 형식이 데이터, 매우 시간이 소모되지 않습니다 하나를 저장할 수있는 더 좋은 방법은 무엇입니까? 그것은 1 억 행을 포함하는 전체 데이터로 확장 가능해야합니다.

+0

가 어떻게 창조 하셨 는가 내가 추가/원래 DF 및 count 희소 행렬을 저장하기를 권 해드립니다 왜 년대 'counts' 칼럼? – MaxU

+0

코드에이 코드를 추가했습니다. – Tobias

+1

스파 스 매트릭스를 팬더 열로 저장하는 것이 좋습니다. IMO 오류가 발생하기 쉽습니다. 나는 그들을 개별적으로 보관할 것입니다 ... – MaxU

답변

1
df['counts'] = counts 

len(df)각 요소와 동일한 요소와 # 팬더 시리즈 (열)을 생성한다vectorizer.fit_transform(df['string_data'])

의해 반환되는 희소 행렬에는을 시도 할 수있다 다음

df = df.join(pd.DataFrame(counts.A, columns=vectorizer.get_feature_names(), index=df.index) 

참고 :이 densed (스파 스되지 않음) DataFrame로 희소 행렬을 폭발 알고, 그래서 것 훨씬 더 메모리를 사용하고는 MemoryError

결론으로 ​​끝낼 수 있습니다 별도로

+0

감사합니다. 실제로 크기가 폭발했습니다. 나는 당신이 제안한대로 둘을 분리 할 것이다. – Tobias

+0

@Tobias, 다행스럽게도 :) – MaxU

관련 문제