2016-07-27 125 views
1

我有一個propitiatory cursor(arcpy.da.SearchCursor)對象,我需要加載到一個熊貓數據框中。熊貓 - 使用read_csv從發生器對象創建數據框

它實現了next(),reset(),就像您對Python中的生成器對象所期望的那樣。

使用另一篇文章stackexchange,這很出色,我創建了一個類,使得生成器像一個文件類對象一樣工作。這適用於未設置chunksize的默認情況,但是當我爲每個數據幀設置塊大小時,會崩潰python。

我的猜測是n = 0需要實現,所以返回了x行,但到目前爲止這是錯誤的。

實現我的類的正確方法是什麼,所以我可以使用生成器來加載數據框?我需要使用chunksize,因爲我的數據集很大。

因此,僞代碼將是:

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

我使用熊貓版本0.16.1和Python 2.7.10。

Class下:

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)。