2013-03-21 1 views
6

가 어떻게이 파일을 통해 pd.read_csv()에 반복적으로 덩어리를 사용할 수 있습니다 내가 한 번에 전체 데이터 세트에서 읽은 것처럼 는 DTYPE 및 기타 메타 정보를 유지 chunksize 영역 사용하고 계십니까?반복적으로

메모리에 저장하기에는 너무 큰 데이터 세트를 읽어야합니다. pd.read_csv를 사용하여 파일을 가져온 다음 즉시 청크를 HDFStore에 추가하고 싶습니다. 그러나 데이터 형식 유추는 후속 청크에 대해 아무 것도 모릅니다.

테이블에 저장된 첫 번째 청크가 int 만 포함하고 후속 청크에 float가 포함 된 경우 예외가 발생합니다. 따라서 먼저 read_csv를 사용하여 데이터 프레임을 반복하고 의 가장 높은 값인 유추 유형을 유지해야합니다. 또한 객체 유형의 경우 테이블에 문자열로 저장되므로 최대 길이를 유지해야합니다.

전체 데이터 세트를 읽지 않고이 정보 만 유지할 수있는 방법이 있습니까?

답변

8

나는 이것이 직관적이라고 생각하지 않았습니다. 그렇지 않으면 질문을 게시하지 않았을 것입니다. 그러나 다시 한번, 팬더는 일들을 산들 바람처럼 만듭니다. 그러나이 정보로 질문을 유지하는 대량의 데이터 작업을 다른 사람에게 유용 할 수 있습니다 :

In [1]: chunker = pd.read_csv('DATASET.csv', chunksize=500, header=0) 

# Store the dtypes of each chunk into a list and convert it to a dataframe: 

In [2]: dtypes = pd.DataFrame([chunk.dtypes for chunk in chunker]) 

In [3]: dtypes.values[:5] 
Out[3]: 
array([[int64, int64, int64, object, int64, int64, int64, int64], 
     [int64, int64, int64, int64, int64, int64, int64, int64], 
     [int64, int64, int64, int64, int64, int64, int64, int64], 
     [int64, int64, int64, int64, int64, int64, int64, int64], 
     [int64, int64, int64, int64, int64, int64, int64, int64]], dtype=object) 

# Very cool that I can take the max of these data types and it will preserve the hierarchy: 

In [4]: dtypes.max().values 
Out[4]: array([int64, int64, int64, object, int64, int64, int64, int64], dtype=object) 

# I can now store the above into a dictionary: 

types = dtypes.max().to_dict() 

# And pass it into pd.read_csv fo the second run: 

chunker = pd.read_csv('tree_prop_dset.csv', dtype=types, chunksize=500) 
+0

당신은 또한 skiprows를 사용할 수는 건너 뛸 행의 목록을 =, 그리고 그렇게 1-9 UR 샘플링의 모든 행을 건너 뛸 수있다 단 10 번째 행마다 매우 빠를 것입니다 (그리고 prob는 원하는 답을 얻습니다), 나는 여러분 자신이 건너 뛴 행을 직접 생성해야한다고 생각합니다. – Jeff

+0

@Jeff 어떻게 CSV에있는 행의 총 개수를 알지 못하면서 얻을 수 있습니까? – Luke

+3

모든 것을 읽는 것이 필요합니다. 모든 dtypes를 저장하고 끝에 줄이지 않고 각 청크 반복 이후에 최대 dtypes를 선택하는 것도 고려해야합니다. 예를 들어, 2MM 행과 청크 크기가 500 인 CSV는 프레임에 400,000 개의 행을 생성합니다! – jastr