大pandas持久的DataFrame

我正在探索作为一个长期SAS用户切换到Python和pandas。

然而,今天在运行一些testing时,我感到惊讶的是,当试图pandas.read_csv()一个128mb的csv文件时,python内存pandas.read_csv()了。 它有大约20万行和200列的大部分数字数据。

使用SAS,我可以将一个csv文件导入SAS数据集,并且可以像我的硬盘一样大。

pandas有类似的东西吗?

我经常使用大文件,无法访问分布式计算networking。

原则上,它不应该耗尽内存,但目前有一些复杂的Python内部问题导致的大文件read_csv存在内存问题(这是模糊的,但已知很长一段时间: http : //github.com/ pydata / pandas / issues / 407 )。

目前还没有一个完美的解决scheme(这里是一个单调乏味的解决scheme:你可以将文件逐行转录成预分配的NumPy数组或内存映射文件np.mmap )我们会在不久的将来 另一个解决scheme是以小块读取文件(使用iterator=True, chunksize=1000 ),然后与pd.concat连接。 当你把整个文本文件放到内存中时,问题就来了。

韦斯当然是对的! 我只是在提供一个更完整的示例代码。 我有一个129 MB的文件,这是通过解决相同的问题:

 from pandas import * tp = read_csv('large_dataset.csv', iterator=True, chunksize=1000) # gives TextFileReader, which is iterable with chunks of 1000 rows. df = concat(tp, ignore_index=True) # df is DataFrame. If errors, do `list(tp)` instead of `tp` 

这是一个较旧的线程,但我只想在这里转储我的解决scheme解决scheme。 我最初尝试了chunksize参数(即使是非常小的值,如10000),但没有多大帮助。 内存大小仍然存在技术问题(我的CSV是〜7.5 Gb)。

现在,我只是在一个for-loop方法中读取CSV文件块,然后将它们添加到一个SQLite数据库中,

 import pandas as pd import sqlite3 from pandas.io import sql import subprocess # In and output file paths in_csv = '../data/my_large.csv' out_sqlite = '../data/my.sqlite' table_name = 'my_table' # name for the SQLite database table chunksize = 100000 # number of lines to process at each iteration # columns that should be read from the CSV file columns = ['molecule_id','charge','db','drugsnow','hba','hbd','loc','nrb','smiles'] # Get number of lines in the CSV file nlines = subprocess.check_output('wc -l %s' % in_csv, shell=True) nlines = int(nlines.split()[0]) # connect to database cnx = sqlite3.connect(out_sqlite) # Iteratively read CSV and dump lines into the SQLite table for i in range(0, nlines, chunksize): df = pd.read_csv(in_csv, header=None, # no header, define column header manually later nrows=chunksize, # number of rows to read at each iteration skiprows=i) # skip rows that were already read # columns to read df.columns = columns sql.to_sql(df, name=table_name, con=cnx, index=False, # don't use CSV file index index_label='molecule_id', # use a unique column from DataFrame as index if_exists='append') cnx.close() 

如果你想加载巨大的csv文件,dask可能是一个不错的select。 它模仿pandasapi,所以感觉和pandas非常相似

链接到github上的dask

你可以使用Pytable而不是pandasdf。 它是专为大型数据集和文件格式在hdf5。 所以处理时间相对较快。

以下是我的工作stream程。

 import sqlalchemy as sa import pandas as pd import psycopg2 count = 0 con = sa.create_engine('postgresql://postgres:pwd@localhost:00001/r') #con = sa.create_engine('sqlite:///XXXXX.db') SQLite chunks = pd.read_csv('..file', chunksize=10000, encoding="ISO-8859-1", sep=',', error_bad_lines=False, index_col=False, dtype='unicode') 

根据你的文件大小,你最好优化块大小。

  for chunk in chunks: chunk.to_sql(name='Table', if_exists='append', con=con) count += 1 print(count) 

在数据库中有所有数据后,您可以从数据库中查询出您需要的数据。