pandas.DataFrame及from_records的data参数是否支持延迟求值?
Pandas DataFrame构造函数与from_records的data参数是否支持延迟求值?
直接给结论
不管是pandas.DataFrame()的构造函数,还是DataFrame.from_records()类方法,它们的data参数都不支持延迟求值。只要你传入生成器这类可迭代对象,它们会立刻把整个迭代器的数据全部读完,不会留到需要的时候再逐行读取。
你的测试已经给出了答案
你自己做的测试案例完美验证了这一点:
>>> g = ((x, x+1) for x in range(5)) >>> d = pandas.DataFrame.from_records(g) >>> next(g) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
调用from_records(g)之后,生成器g已经被彻底消耗光了,再调用next(g)自然就抛出了StopIteration。这说明Pandas在执行这个方法的时候,是一次性把迭代器里所有数据都加载到内存里生成DataFrame,完全没有做延迟求值的处理。
对大型数据集的影响
正如你担心的,这种立即求值的方式在处理大型InputDataSet时会有扩展性问题:
- 虽然
InputDataSet.iterrows()本身是逐行返回的迭代器,但一旦把它传给from_records(),Pandas就会一次性把所有行都读进内存,没法实现你想要的“逐行按需读取”的流式处理。 - 如果数据集太大,很容易直接把内存撑爆,根本没法处理。
如果你需要流式处理的话
如果要处理超大型数据集,实现类似延迟加载的效果,可以试试这些办法:
- 用Pandas自带的IO工具,比如
pandas.read_csv(),它支持chunksize参数,可以分块读取数据,每次只处理一小部分; - 针对自定义数据源,自己写分块迭代的逻辑,每次生成一小批数据来构造DataFrame处理,避免一次性加载全量数据。
内容的提问来源于stack exchange,提问作者user1443098
相关产品推荐
相关产品推荐

