在pandas中的大型持久DataFrame。

13 浏览
0 Comments

在pandas中的大型持久DataFrame。

我是一位长期使用SAS的用户,现在正在探索转向Python和Pandas。然而,今天在运行一些测试时,我惊讶地发现当尝试使用pandas.read_csv()读取一个大小为128mb的csv文件时,Python会因为内存不足而无法运行。这个文件大约有20万行和200列,主要是数值数据。在SAS中,我可以将csv文件导入到SAS数据集中,其大小可以达到硬盘的容量。在Pandas中有类似的功能吗?我经常处理大文件,并且没有访问分布式计算网络的权限。

0
0 Comments

大型持久DataFrame在pandas中的问题的出现原因是数据量太大,导致内存不足,无法一次性读取整个CSV文件。解决方法是使用分块读取的方式,将CSV文件分块读取并逐步添加到SQLite数据库中。

代码实现如下:

import pandas as pd
import sqlite3
from pandas.io import sql
import subprocess
# 输入和输出文件路径
in_csv = '../data/my_large.csv'
out_sqlite = '../data/my.sqlite'
table_name = 'my_table'  # SQLite数据库表的名称
chunksize = 100000  # 每次迭代处理的行数
# 需要从CSV文件中读取的列
columns = ['molecule_id', 'charge', 'db', 'drugsnow', 'hba', 'hbd', 'loc', 'nrb', 'smiles']
# 获取CSV文件的行数
nlines = subprocess.check_output('wc -l %s' % in_csv, shell=True)
nlines = int(nlines.split()[0])
# 连接到数据库
cnx = sqlite3.connect(out_sqlite)
# 逐步读取CSV并将行数据添加到SQLite表中
for i in range(0, nlines, chunksize):
    df = pd.read_csv(in_csv,
                     header=None,  # 没有标题,稍后手动定义列标题
                     nrows=chunksize,  # 每次迭代读取的行数
                     skiprows=i)  # 跳过已读取的行
    # 设置列名
    df.columns = columns
    # 将数据添加到SQLite表中
    sql.to_sql(df,
               name=table_name,
               con=cnx,
               index=False,  # 不使用CSV文件的索引
               index_label='molecule_id',  # 使用DataFrame中的唯一列作为索引
               if_exists='append')
cnx.close()

这种分块读取的方法可以有效地解决内存不足的问题,将大型DataFrame分成小块逐步处理,避免一次性加载整个数据集到内存中。通过将数据逐步添加到SQLite数据库中,可以实现数据的持久化存储。

不过需要注意的是,旧版本的pandas.read_csv方法可能存在bug,导致内存爆炸。因此,如果使用较旧的版本,建议使用上述的分块读取方法。现在的版本已经修复了这个问题,可以直接使用`iterator=True`和`chunksize`参数来实现迭代读取。

以上就是解决大型持久DataFrame在pandas中的问题的原因和解决方法。通过分块读取和逐步添加到SQLite数据库中,可以有效地处理大型数据集,避免内存不足的问题。

0
0 Comments

大型持久的DataFrame在pandas中出现的原因是由于一些复杂的Python内部问题导致的,目前在处理大文件时使用read_csv存在内存问题。虽然目前还没有完美的解决方案,但可以通过以下方法解决:一种方法是将文件逐行转录到预先分配的NumPy数组或内存映射文件中,另一种方法是将文件分为较小的片段进行读取,然后使用pd.concat将它们连接在一起。当整个文本文件一次性读入内存时,就会出现问题。

在SAS中,只要有硬盘空间,可以处理任何大小的数据集。但是在pandas中,DataFrame受到RAM的限制,而不是硬盘空间的限制。

之前的csv加载器解决了这些问题,所以不再需要这些解决方法。

0
0 Comments

在这段对话中,出现了一个关于使用pandas处理大型持久DataFrame的问题。问题的原因是内存不足,导致程序崩溃。解决方法是使用迭代器和分块读取的方式处理大型数据集。

首先,使用迭代器和分块读取的方式可以解决内存不足的问题。代码示例中使用了pandas的read_csv函数,参数iterator设置为True,chunksize设置为1000,这样可以返回一个TextFileReader对象,它可以按照指定的chunksize分块读取数据。

然后,通过迭代器遍历每个数据块,并使用iterrows方法逐行处理数据。在代码示例中,使用了嵌套的循环来遍历数据块的每一行,并打印出每一行的内容。

接下来,使用concat函数将所有的数据块合并为一个大的DataFrame。在代码示例中,使用了pd.concat函数,参数为tp和ignore_index=True。这样可以将所有的数据块按顺序合并,并重新设置索引。

然而,在代码示例中还出现了一个错误,错误信息为"AssertionError: first argument must be a list-like of pandas objects, you passed an object of type 'TextFileReader'"。这个错误是因为pd.concat函数要求第一个参数是一个类似列表的pandas对象,但实际传递的是一个TextFileReader对象。这个问题将在0.14版本中修复,可以通过将TextFileReader对象转换为列表解决,即使用pd.concat(list(tp), ignore_index=True)。

最后,还有一个问题是关于ignore_index参数的作用。ignore_index参数的默认值是False,表示合并后的DataFrame保留原有的索引。而设置为True时,将重新生成一个新的索引。在处理大型数据集时,通常会设置ignore_index为True,这样可以避免合并后的DataFrame索引过大,导致内存消耗过大。

总结一下,当处理大型持久DataFrame时,可能会遇到内存不足的问题。为了解决这个问题,可以使用迭代器和分块读取的方式来处理大型数据集。具体步骤是通过read_csv函数返回一个迭代器,然后使用迭代器遍历每个数据块并逐行处理数据,最后使用concat函数将所有的数据块合并为一个大的DataFrame。在处理过程中,还需要注意一些错误和参数设置,以确保程序能够正确运行。

0