私は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つのエントリだけを読み込むために 'read(self)'を実装するとうまくいくのでしょうか? – ptrj
私は 'pd.read_csv'を意味すると仮定します:' pd.from_csv'は 'chunksize'引数を受け入れません。 –
@ptrj - python.exeがクラッシュする原因となります。 –