从生成器创建pandas DataFrame?
我创建了一个元组生成器,该元组生成器从仅过滤感兴趣记录的文件中提取信息,并将其转换为生成器返回的元组。
我尝试从创建数据框:
import pandas as pddf = 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