Pandas - 使用read_csv

时间:2016-07-27 10:43:13

标签: python python-2.7 pandas

我有一个支持光标(arcpy.da.SearchCursor)对象,我需要将其加载到pandas数据帧中。

它实现了next(),reset(),正如您对Python中的生成器对象所期望的那样。

使用stackexchange中的另一篇文章,这很棒,我创建了一个类,使生成器像一个类文件对象。这适用于默认情况,其中未设置chunksize,但是当我为每个数据帧设置块大小时,它会崩溃python。

我的猜测是需要实现n = 0,所以返回x行数,但到目前为止这是错误的。

实现我的类的正确方法是什么,所以我可以使用生成器来加载数据帧?我需要使用chunksize,因为我的数据集非常庞大。

所以伪代码是:

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

我正在使用Pandas版本0.16.1和Python 2.7.10。

以下课程:

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 个答案:

答案 0 :(得分: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)

您应该使用pd.read_csv参数(不是names)告诉columns列名称,并且没有标题行(header=None)。