我正在使用pandas处理一个包含大量8字节整数的数组。这些整数以空格分隔的元素形式包含在逗号分隔的CSV文件的一列中,数组大小约为10000x10000。
Pandas可以快速将逗号分隔的数据从前几列读取为DataFrame,并且也可以轻松地将空格分隔的字符串存储在另一个DataFrame中,但当我尝试将表格从单列空格分隔的字符串转换为8位整数的DataFrame时,问题就出现了。
我已经尝试了以下方法:
intdata = pd.DataFrame(strdata.columnname.str.split().tolist(), dtype='uint8')
但内存使用量无法承受——价值10MB的整数消耗了2GB的内存。我被告知这是语言的限制,在这种情况下我无能为力。
作为一种可能的解决方法,人们建议我将字符串数据保存到CSV文件中,然后重新加载CSV文件以成为空格分隔的整数DataFrame。这个方法很有效,但为了避免写入磁盘而带来的减速,我尝试把数据写入StringIO对象中。
以下是一个最小的不起作用的示例:
import numpy as np
import pandas as pd
from cStringIO import StringIO
a = np.random.randint(0,256,(10000,10000)).astype('uint8')
b = pd.DataFrame(a)
c = StringIO()
b.to_csv(c, delimiter=' ', header=False, index=False)
d = pd.io.parsers.read_csv(c, delimiter=' ', header=None, dtype='uint8')
会产生以下错误信息:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 443, in parser_f
return _read(filepath_or_buffer, kwds)
File "/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 228, in _read
parser = TextFileReader(filepath_or_buffer, **kwds)
File "/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 533, in __init__
self._make_engine(self.engine)
File "/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 670, in _make_engine
self._engine = CParserWrapper(self.f, **self.options)
File "/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 1032, in __init__
self._reader = _parser.TextReader(src, **kwds)
File "parser.pyx", line 486, in pandas.parser.TextReader.__cinit__ (pandas/parser.c:4494)
ValueError: No columns to parse from file
这很令人困惑,因为如果我用'c.csv'
而不是c
运行完全相同的代码时,代码可以完美地工作。此外,如果我使用以下片段:
file = open('c.csv', 'w')
file.write(c.getvalue())
CSV文件成功保存,因此向StringIO对象写入内容并非问题所在。
我可能需要在read_csv行中使用c.getvalue()
替换 c
,但这样做会导致解释器在终端上打印 c
的内容!肯定有方法可以解决这个问题。
提前感谢您的帮助。