2016-07-27 21 views
1

私はpandasデータフレームにロードする必要があるpropitiatoryカーソル(arcpy.da.SearchCursor)オブジェクトを持っています。Pandas - read_csvを使用してGeneratorオブジェクトからDataframeを作成

Pythonのジェネレータオブジェクトと同じようにnext()、reset()を実装しています。

stackexchangeの別の投稿を使用しています。これは、華麗ですが、ジェネレータをファイルライクなオブジェクトのように動作させるクラスを作成しました。これはchunkksizeが設定されていないデフォルトのケースで機能しますが、各データフレームのチャンクサイズを設定すると、pythonがクラッシュします。

私の推測では、x = 0の行が返されるようにn = 0を実装する必要がありますが、今のところこれは間違っています。

ジェネレータを使用してデータフレームをロードできるように、クラスを実装する適切な方法は何ですか?私はデータセットが巨大なので、chunksizeを使用する必要があります。

ので、擬似コードは次のようになります。

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

私はパンダのバージョン0.16.1とPython 2.7.10を使用しています。以下

クラス:あなたはnames引数(ないcolumns)を使用してpd.read_csv列名を教えて、あなたは何のヘッダ行を持っていないことをすべきである

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) 

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

一度に1つのエントリだけを読み込むために 'read(self)'を実装するとうまくいくのでしょうか? – ptrj

+0

私は 'pd.read_csv'を意味すると仮定します:' pd.from_csv'は 'chunksize'引数を受け入れません。 –

+0

@ptrj - python.exeがクラッシュする原因となります。 –

答えて

0

は以下のread機能を試してみてください(header=None)。

関連する問題