在pandas中的大型持久DataFrame。
大型持久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数据库中,可以有效地处理大型数据集,避免内存不足的问题。
大型持久的DataFrame在pandas中出现的原因是由于一些复杂的Python内部问题导致的,目前在处理大文件时使用read_csv存在内存问题。虽然目前还没有完美的解决方案,但可以通过以下方法解决:一种方法是将文件逐行转录到预先分配的NumPy数组或内存映射文件中,另一种方法是将文件分为较小的片段进行读取,然后使用pd.concat将它们连接在一起。当整个文本文件一次性读入内存时,就会出现问题。
在SAS中,只要有硬盘空间,可以处理任何大小的数据集。但是在pandas中,DataFrame受到RAM的限制,而不是硬盘空间的限制。
之前的csv加载器解决了这些问题,所以不再需要这些解决方法。
在这段对话中,出现了一个关于使用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。在处理过程中,还需要注意一些错误和参数设置,以确保程序能够正确运行。