【发布时间】:2013-09-25 19:01:47
【问题描述】:
我创建了一个元组生成器,它从文件中提取信息,仅过滤感兴趣的记录并将其转换为生成器返回的元组。
我尝试从以下位置创建一个 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)
我要加载的文件很大,而且内存消耗很重要。最后一次尝试我的电脑花了两个小时试图增加虚拟内存:(
问题:有谁知道直接从记录生成器创建数据帧的方法,而无需事先将其转换为列表?
注意:我在 Windows 上将 python 3.3 和 pandas 0.12 与 Anaconda 一起使用。
更新:
读取文件不是问题,我的元组生成器做得很好,它逐行扫描混合记录的文本压缩文件,只将想要的数据转换为正确的类型,然后在元组生成器中生成字段形式。 有些数字,它在大约一分钟内扫描了 130MB gzip 文件中的 2111412 条记录,未压缩约 6.5GB。
Pandas 0.12 不允许生成器,开发版允许,但将所有生成器放在一个列表中,然后转换为框架。它效率不高,但必须在内部处理熊猫。与此同时,我必须考虑购买更多内存。
【问题讨论】:
-
问题一定出在
tuple_generator,因为像tuple_generator = (item for item in [[1,2,3],[2,3,4,5]])这样的简单生成器表达式不会出现问题。 -
@unutbu 不在 pandas 0.12 上。在开发版本上它可以正常工作。
-
@ViktorKerkez:哦,我明白了。感谢您的信息。
-
听起来您可能遇到thrashing,在这种情况下,您应该考虑为您的机器添加更多内存。
标签: python python-3.x pandas