当前位置: 首页 > 面试题库 >

从生成器创建pandas DataFrame?

耿炎彬
2023-03-14
问题内容

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

我尝试从创建数据框:

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


 类似资料:
  • 问题内容: 我有大量的数据(几场演出),我需要用Python编写一个zip文件。我无法一次全部将其加载到内存中以传递给ZipFile的.writestr方法,我真的不想使用临时文件将其全部馈入磁盘,然后再读回。 有没有办法将生成器或类似文件的对象提供给ZipFile库?还是由于某种原因似乎不支持此功能? 压缩文件是指压缩文件。如Python zipfile包中所支持。 问题答案: 唯一的解决方案是

  • 如何在Java中使用构建器创建一个火花会话?我试过这个: 但我在“getOrCreate”中遇到了一个例外。是否有任何方法可以使用JavaSparkContext/SparkContext创建spark会话? 线程“main”中的异常java.lang.NoSuchmetodError:6.applyUserGroupIession.scala:860MONtUser()Lorg/apache/h

  • 问题内容: 我需要一个创建对象的类,为每个创建的对象分配一个ID。通常,此ID是该类的int属性。我希望每次创建一个对象时都增加该值(ID),然后将其分配给从1开始的那个对象。这让我感到震惊,我需要一个静态int属性。 如何初始化此静态属性? 我是否应该创建一个单独的方法来进行ID的增量(作为ID生成器),该增量在构造函数内部调用? 通常,最有效和精心设计的方法是什么? 问题答案: 就像您提到的I

  • 我正在尝试使用eclipse gmf创建一个基于uml模型的图形编辑器, 为此,我基于我的uml模型创建了一个.gnemodel文件,但在生成的.ecore文件中没有关联

  • 如何为第三方类创建Lombok生成器(即,我无法修改其源代码)? 我有一个无法更改的现有类: 现在我想创建一个,这样我就可以得到一个流畅的Builder api,用默认值简化的实例化。这就是我所尝试的: 代码已编译,我可以参考生成器,例如。 但是,对于和而言,这不起作用,因为返回。

  • 我正在使用 https://github.com/OpenAPITools/openapi-generator 为我的应用编程接口创建一个客户端。它基本上工作正常,但是生成器创建了许多类型,这些类型封装了包括任何复杂性类型的参数,例如、、 例如 其中InlineObject11定义为 这有什么意义?为什么生成的客户端不接受流再平衡贸易文件(Stream rebalanceTradeFile),而不