2016-07-27 3 views
1

팬더 데이터 프레임에로드해야하는 propitiatory 커서 (arcpy.da.SearchCursor) 객체가 있습니다.팬더 - read_csv를 사용하여 Generator 객체에서 Dataframe 만들기

Python에서 생성기 객체에 대해 예상하는대로 next(), reset()을 구현합니다.

화려한 게시물 인 stackexchange에 다른 게시물을 사용하여 파일 생성기처럼 작동하는 클래스를 만들었습니다. 이것은 chunkksize가 설정되지 않은 기본 경우에 적용되지만 각 데이터 프레임에 대한 청크 크기를 설정하면 Python이 충돌합니다.

내 생각에 n = 0을 구현해야 x 개의 행이 반환되지만 지금까지는 잘못되었습니다.

발전기를 사용하여 데이터 프레임을로드 할 수 있도록 클래스를 구현하는 올바른 방법은 무엇입니까? 내 데이터 세트가 크기 때문에 chunkksize를 사용해야합니다.

그래서 의사 코드는 다음과 같습니다 내가 팬더 버전 0.16.1 및 파이썬 2.7.10을 사용하고

customfileobject = Reader(cursor) 
dfs = pd.read_csv(customfileobject, columns=cursor.fields, 
        chunksize=10000) 

.

등급 이하 :

class Reader(object): 

    """allows a cursor object to be read like a filebuffer""" 
    def __init__(self, fc=None, columns="*", cursor=None): 
     if cursor or fc: 
      if fc: 
       self.g = arcpy.da.SearchCursor(fc, columns) 
      else: 
       self.g = cursor 
     else: 
      raise ValueError("You must provide a da.SearchCursor or table path and column names") 
    def read(self, n=0): 
     try: 
      vals = [] 
      if n == 0: 
       return next(self.g) 
      else: 
       # return multiple rows? 
       for x in range(n): 
        try: 
         vals.append(self.g.next()) 
        except StopIteration: 
         return '' 
     except StopIteration: 
      return '' 
    def reset(self): 
     self.g.reset() 
+1

한 번에 하나의 항목 만 읽으려면'read (self)'를 구현하면됩니까? – ptrj

+0

나는'pd.read_csv'를 사용한다고 가정한다 :'pd.from_csv'는'chunksize' 인수를 허용하지 않는다. –

+0

@ptrj - python.exe가 충돌합니다. –

답변

0

다음 read 기능을 시도해보십시오

def read(self, n=0): 
    if n == 0: 
     try: 
      return next(self.g) 
     except StopIteration: 
      return '' 
    else: 
     vals = [] 
     try: 
      for x in range(n): 
       vals.append(next(self.g)) 
     except StopIteration: 
      pass 
     finally: 
      return ''.join(vals) 

당신은 names 인수 (안 columns)를 사용하여 pd.read_csv 열 이름을 말해야을, 당신은 어떤 헤더 행이 없다는 것을 (header=None).