我有一个数据帧,它有超过400K行和几百列,我决定用块来读入,因为它不适合内存,并给我内存错误。
我已经设法把它读成这样的一大块:

x = pd.read_csv('Training.csv', chunksize=10000)

然后我可以通过这样做得到每一块:
a = x.get_chunk()
b = x.get_chunk()

etc一直这样做超过40次,这显然是缓慢和糟糕的编程实践。
当我尝试执行以下操作以创建一个可以将每个块保存到数据帧中并以某种方式连接它们的循环时:
for x in pd.read_csv('Training.csv', chunksize=500):
    x.get_chunk()

我得到:
AttributeError: 'DataFrame' object has no attribute 'get_chunk'

在导入过程中,读取文件并连接所有块的最简单方法是什么?
另外,如何进一步操作数据集以避免内存错误问题(特别是,输入空值、标准化/规范化数据帧,然后使用scikit learn在其上运行机器学习模型)?

最佳答案

当您在对pandas.read_csv的调用中指定chunksize时,将返回pandas.io.parsers.TextFileReader对象,而不是数据帧。请尝试以下操作:

reader = pd.read_csv('Training.csv',chunksize=500)
for chunk in reader:
    print(type(chunk)) # chunk is a dataframe

或者抓住所有的块(这可能解决不了你的问题!):
reader = pd.read_csv('Training.csv',chunksize=500)
chunks = [chunk for chunk in reader] # list of DataFrames

根据数据集中的内容,减少内存使用的一个好方法是标识可以转换为分类数据的列。任何一列的不同值的数量远远低于行的数量,都是这种情况的候选列。假设一列包含某种状态,且其值有限(例如“打开”、“关闭”、“保留”),请执行以下操作:
chunk['Status'] = chunk.assign(Status=lambda x: pd.Categorical(x['Status']))

现在,这将只为每一行存储一个整数,数据帧将保存一个映射(例如0=打开,1=关闭等)
您还应该查看是否有任何数据列是冗余的(它们实际上包含相同的信息)-如果有,则删除它们。我见过一些电子表格,其中包含了人们可以轻松处理的日期,人们可以在其中生成年、周、日的列。把他们赶走!

07-28 02:47