2016-07-27 63 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)。