2016-10-07 5 views
1

크기가 큰 CSV 800GB에서 데이터를 파싱 중입니다. 각 데이터 행마다 판다 데이터 프레임으로 저장합니다.하나의 키/그룹에서 여러 팬더 데이터 프레임을 HDF5 오브젝트로 결합하는 방법은 무엇입니까?

readcsvfile = csv.reader(csvfile) 
for i, line in readcsvfile: 
    # parse create dictionary of key:value pairs by csv field:value, "dictionary_line" 
    # save as pandas dataframe 
    df = pd.DataFrame(dictionary_line, index=[i]) 

이제 나는 HDF5 형식으로이를 저장하고 전체 CSV 파일이었다 것처럼 H5를 조회하고 싶습니다.

import pandas as pd 
store = pd.HDFStore("pathname/file.h5") 

hdf5_key = "single_key" 

csv_columns = ["COL1", "COL2", "COL3", "COL4",..., "COL55"] 

내 접근 방식은 지금까지왔다 :

입니다
import pandas as pd 
store = pd.HDFStore("pathname/file.h5") 

hdf5_key = "single_key" 

csv_columns = ["COL1", "COL2", "COL3", "COL4",..., "COL55"] 
readcsvfile = csv.reader(csvfile) 
for i, line in readcsvfile: 
    # parse create dictionary of key:value pairs by csv field:value, "dictionary_line" 
    # save as pandas dataframe 
    df = pd.DataFrame(dictionary_line, index=[i]) 
    store.append(hdf5_key, df, data_columns=csv_columns, index=False) 

, 나는 하나의 키 아래에있는 HDF5에 각 dataframe df을 저장하려고합니다. 그러나이 실패 : 그래서

Attribute 'superblocksize' does not exist in node: '/hdf5_key/_i_table/index' 

, 내가 첫 번째 팬더 dataframe에 모든 것을 저장을 시도 할 수 있습니다, 즉 지금

import pandas as pd 
store = pd.HDFStore("pathname/file.h5") 

hdf5_key = "single_key" 

csv_columns = ["COL1", "COL2", "COL3", "COL4",..., "COL55"] 
readcsvfile = csv.reader(csvfile) 
total_df = pd.DataFrame() 
for i, line in readcsvfile: 
    # parse create dictionary of key:value pairs by csv field:value, "dictionary_line" 
    # save as pandas dataframe 
    df = pd.DataFrame(dictionary_line, index=[i]) 
    total_df = pd.concat([total_df, df]) # creates one big CSV 

store.append(hdf5_key, total_df, data_columns=csv_columns, index=False) 

그러나 HDF5 형식으로 저장, 나는 내가 모든 csv 라인을 total_df에 HDF5 포맷으로 저장하기 위해 RAM/스토리지를 가지고 있다고 생각하지 마십시오.

그렇다면 각 "단일 라인"df를 HDF5에 추가하여 원래의 csv와 같은 하나의 큰 데이터 프레임으로 끝내려면 어떻게해야합니까?

편집 : 여기에 다른 데이터 유형이있는 CSV 파일의 구체적인 예는 다음과 같습니다

order start end value  
1  1342 1357 category1 
1  1459 1489 category7 
1  1572 1601 category23 
1  1587 1599 category2 
1  1591 1639 category1 
.... 
15  792  813 category13 
15  892  913 category5 
.... 
+0

모든 항목이 같은 유형입니까? IRC, hdf5는 혼합 배열을 수행하지 않습니다. – Paul

+0

@Paul 전체 + TB csv 데이터 테이블을 HDF5 형식으로 저장하는 방법은 무엇입니까? – ShanZhengYang

+0

@MaxU 당신이 HDF5 전문가라는 것을 알고 있습니다. 이것이 가능한가? 그것은 매우 간단한 작업처럼 느껴집니다 ... – ShanZhengYang

답변

1

귀하의 코드는 다음과 같은 코드를 시도 할 수있다, 작동합니다 : 코드가 작동하는 경우

import pandas as pd 
import numpy as np 

store = pd.HDFStore("file.h5", "w") 
hdf5_key = "single_key" 
csv_columns = ["COL%d" % i for i in range(1, 56)] 
for i in range(10): 
    df = pd.DataFrame(np.random.randn(1, len(csv_columns)), columns=csv_columns) 
    store.append(hdf5_key, df, data_column=csv_columns, index=False) 
store.close() 

을, 그러면 데이터에 문제가 있습니다.

+0

이 코드는 작동하지만 --- 어떤 데이터가 "잘못"될 수 있는지 잘 모르겠습니다. '속성 'superblocksize'속성이 노드에 존재하지 않습니다 : '/ hdf5_key/_i_table/index'' 또는'ValueError : [COLl1, COL2, COL3, COL4, COL5, ...]의 기존 테이블 구조와 일치하지 않습니다. ] – ShanZhengYang

+0

사실,이 예제가 작동하는 이유는 'ValueError : 데이터 추가시 [COLl1, COL2, COL3, COL4, COL5, ...]에 대한 기존 테이블 구조와 일치 할 수 없습니다.'오류가 발생합니다. 내 데이터에는 여러 유형이 있습니다. 'df '의 열에 문자열, 정수, 부동 소수점 등이 있다면 위의 작업을 어떻게 수행할까요? – ShanZhengYang

+0

@ShanZhengYang 문자열과 숫자가 모두있는 열이있는 경우 먼저 모든 값을 문자열이나 숫자로 변환하십시오. – HYRY