从生成器创建pandas DataFrame?

我创建了一个元组生成器,该元组生成器从仅过滤感兴趣记录的文件中提取信息,并将其转换为生成器返回的元组。

我尝试从创建数据框:

import pandas as pd

df = pd.DataFrame.from_records(tuple_generator, columns = tuple_fields_name_list)

但是抛出一个错误:

... 

C:\Anaconda\envs\py33\lib\site-packages\pandas\core\frame.py in from_records(cls, data, index, exclude, columns, coerce_float, nrows)

1046 values.append(row)

1047 i += 1

-> 1048 if i >= nrows:

1049 break

1050

TypeError: unorderable types: int() >= NoneType()

我设法让它使用列表中的生成器,但是使用了两次内存:

df = pd.DataFrame.from_records(list(tuple_generator), columns = tuple_fields_name_list)

我要加载的文件很大,内存消耗很重要。我的计算机的最后一次尝试花了两个小时来尝试增加虚拟内存:(

有人知道直接从记录生成器创建DataFrame的方法,而无需事先将其转换为列表吗?

注意:我在Windows上将Python 3.3和pandas 0.12与Anaconda一起使用。

读取文件不是问题,我的元组生成器做得很好,它逐行扫描混合记录的文本压缩文件,仅将所需数据转换为正确的类型,然后以元组形式生成字段。某些数字可以在大约一分钟内且几乎不占用内存的情况下扫描130MB

gzip文件(约6.5GB未压缩)上的2111412记录。

Pandas

0.12不允许生成器,开发版本允许它,但是将所有生成器放在列表中,然后转换为框架。它效率不高,但必须在内部处理熊猫。同时,我必须考虑购买更多的内存。

回答:

您无法使用0.12版本的熊猫从生成器创建DataFrame。您可以将自己更新为开发版本(从github获取并进行编译-

在Windows上有点痛苦,但我希望使用此选项)。

或者您也可以,因为您说过要过滤行,请先过滤它们,将它们写入文件,然后使用read_csv或其他方式加载它们。

如果您想变得超级复杂,可以创建一个类似于object的文件,该文件将返回以下行:

def gen():

lines = [

'col1,col2\n',

'foo,bar\n',

'foo,baz\n',

'bar,baz\n'

]

for line in lines:

yield line

class Reader(object):

def __init__(self, g):

self.g = g

def read(self, n=0):

try:

return next(self.g)

except StopIteration:

return ''

然后使用read_csv

>>> pd.read_csv(Reader(gen()))

col1 col2

0 foo bar

1 foo baz

2 bar baz

以上是 从生成器创建pandas DataFrame? 的全部内容, 来源链接: utcz.com/qa/406545.html

回到顶部