2016-09-27 3 views
8

하나의 데이터 프레임으로 읽으려면 너무 큰 범주 형 데이터 (주로 "Nan"- 여기저기서 실제 값으로 채워짐)의 큰 파일 (2GB)이 있습니다. . 각 열의 모든 고유 값을 저장하는 객체로 오히려 어려움을 겪었습니다 (어떤 것이 내 목표입니까 - 결국 모델링을 위해 이것을 분해해야합니다).목록 목록을 늘리는 Python 방법

내가 끝낸 것은 파일을 읽는 것이 었습니다. 청크로 데이터 프레임에 넣은 다음 각 열의 고유 한 값을 가져 와서 목록에 저장합니다. 내 솔루션은 작동하지만 파이썬이 아닌 듯 보였습니다. 파이썬 (ver 3.5)에서이를 수행 할 수있는 더 깨끗한 방법이 있습니까? 열 수 (~ 2100)를 알고 있습니다. 다음과 같이 그 후

import pandas as pd 
#large file of csv separated text data 
data=pd.read_csv("./myratherlargefile.csv",chunksize=100000, dtype=str) 

collist=[] 
master=[] 
i=0 
initialize=0 
for chunk in data: 
    #so the first time through I have to make the "master" list 
    if initialize==0: 
     for col in chunk: 
      #thinking about this, i should have just dropped this col 
      if col=='Id': 
       continue 
      else: 
       #use pd.unique as a build in solution to get unique values 
       collist=chunk[col][chunk[col].notnull()].unique().tolist() 
       master.append(collist) 
       i=i+1 
    #but after first loop just append to the master-list at 
    #each master-list element 
    if initialize==1: 
     for col in chunk: 
      if col=='Id': 
       continue 
      else: 
       collist=chunk[col][chunk[col].notnull()].unique().tolist() 
       for item in collist: 
        master[i]=master[i]+collist 
       i=i+1 
    initialize=1 
    i=0 

는 모든 고유 값에 대한 내 마지막 작업은 다음과 같습니다

i=0 
names=chunk.columns.tolist() 
for item in master: 
    master[i]=list(set(item)) 
    master[i]=master[i].append(names[i+1]) 
    i=i+1 

따라서 마스터 [I] 나에게 열 이름 다음 고유 한 값의 목록을 제공합니다 - 원유를하지만, 그것은 효과가 있습니다 - 제 관심사는 가능한 경우 "더 나은"방법으로 목록을 작성하는 것입니다.

+0

는 생각지 사용하는 것이 좋습니다? (yield 키워드 검색) – salparadise

+0

그 트릭을 할 수도 있습니다. 저는 반복자와 생성자에 대해서는 아직 좋지 않습니다. 그러나 제안 된대로 yield 키워드를 간단히 훑어 보는 것이 올바른 방향 인 것으로 보입니다. – RDS

+0

이것은 실제로 후드 아래의 발전기를 사용하고 있습니다. 청크 스는 그 일을 정확하게 수행하고 있습니다. 호기심 때문에 32 비트 또는 64 비트 머신/파이썬에서 실행되고 있습니까? 'import sys; print (sys.maxsize) '는 파이썬 2.6을 실행하는 동안 작동해야합니다. –

답변

8

collections.defaultdict(set)을 사용하여 listlist 인 대신 제안 할 것입니다.

for chunk in data: 
    for col in chunk: 
     uniques[col] = uniques[col].union(chunk[col].unique()) 

참고 :

  1. defaultdict 항상 그건 set (uniques[col]에 대한이

    지금 루프는 이런 일이 될 수 있습니다 당신이

    uniques = collections.defaultdict(set) 
    

    로 시작하는 말 그것을 위해 무엇이 있는지), 그래서 당신은 건너 뛸 수 있습니다 initialized 등등.

  2. 주어진 col의 경우 항목을 현재 세트 (처음에는 비어 있지만 중요하지 않음)와 새 고유 요소의 합집합으로 업데이트하면됩니다.

편집

레이몬드 Hettinger 노트로 (감사합니다!),이 유유히 파일을 읽을 발전기를 사용하여

 uniques[col].update(chunk[col].unique()) 
+0

와우 - 코드 1/3의 트릭입니다. 나는 또한 dicts에 일할 필요가있다. 잘 했어. – RDS

+0

@RDS 감사합니다. 나는 너의 질문을 좋아했다. 모두 제일 좋다. –

+0

''set.union'보다는''set.update''로 더 멋지게 보일 것입니다. –