我有一个包含超过 40 万行和数百列的数据框,我决定将其分块读入,因为它不适合内存并给我 MemoryError。
我设法像这样分块阅读它:
x = pd.read_csv('Training.csv', chunksize=10000)
然后我可以通过这样做获得每个 block :
a = x.get_chunk()
b = x.get_chunk()
等等 等等 继续这样做超过 40 次,这显然是缓慢且糟糕的编程习惯。
当我尝试执行以下操作以尝试创建一个可以将每个 block 保存到数据框中并以某种方式连接它们的循环时:
for x in pd.read_csv('Training.csv', chunksize=500):
x.get_chunk()
我得到:
AttributeError: 'DataFrame' object has no attribute 'get_chunk'
在导入过程中读取文件并连接所有 block 的最简单方法是什么?
此外,我如何进一步操作我的数据集以避免内存错误问题(特别是输入空值、标准化/规范化数据帧,然后使用 scikit learn 在其上运行机器学习模型?
最佳答案
当您在对 pandas.read_csv 的调用中指定 chunksize 时,您会得到一个 pandas.io.parsers.TextFileReader 对象而不是一个 DataFrame。试试这个来遍历 block :
reader = pd.read_csv('Training.csv',chunksize=500)
for chunk in reader:
print(type(chunk)) # chunk is a dataframe
或者抓取所有 block (这可能无法解决您的问题!):
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']))
这将只为每一行存储一个整数,DataFrame 将保存一个映射(例如 0 = 'Open'、1 = 'Closed 等)
您还应该查看是否有任何数据列是多余的(它们实际上包含相同的信息)- 如果有则删除它们。我见过包含日期的电子表格,人们在其中生成了年、周、日的列,因为他们发现使用起来更容易。摆脱他们!
关于python - 如何正确地将每一大块数据保存为 Pandas 数据框并将它们相互连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51656554/