我是熊猫的新手,正在尝试合并一些数据子集。我给出了一个具体的例子,但问题是一般性的:它是如何发生的,为什么发生的,我如何解决它?
我加载的数据大约为85兆字节,但我经常看到python会话运行到接近10千兆字节的内存使用量,然后给出一个内存错误。
我不知道为什么会发生这种情况,但这让我很难过,因为我甚至无法开始以我想要的方式查看数据。
以下是我所做的:
导入主数据
import requests, zipfile, StringIO
import numpy as np
import pandas as pd
STAR2013url="http://www3.cde.ca.gov/starresearchfiles/2013/p3/ca2013_all_csv_v3.zip"
STAR2013fileName = 'ca2013_all_csv_v3.txt'
r = requests.get(STAR2013url)
z = zipfile.ZipFile(StringIO.StringIO(r.content))
STAR2013=pd.read_csv(z.open(STAR2013fileName))
导入一些交叉引用表
STARentityList2013url = "http://www3.cde.ca.gov/starresearchfiles/2013/p3/ca2013entities_csv.zip"
STARentityList2013fileName = "ca2013entities_csv.txt"
r = requests.get(STARentityList2013url)
z = zipfile.ZipFile(StringIO.StringIO(r.content))
STARentityList2013=pd.read_csv(z.open(STARentityList2013fileName))
STARlookUpTestID2013url = "http://www3.cde.ca.gov/starresearchfiles/2013/p3/tests.zip"
STARlookUpTestID2013fileName = "Tests.txt"
r = requests.get(STARlookUpTestID2013url)
z = zipfile.ZipFile(StringIO.StringIO(r.content))
STARlookUpTestID2013=pd.read_csv(z.open(STARlookUpTestID2013fileName))
STARlookUpSubgroupID2013url = "http://www3.cde.ca.gov/starresearchfiles/2013/p3/subgroups.zip"
STARlookUpSubgroupID2013fileName = "Subgroups.txt"
r = requests.get(STARlookUpSubgroupID2013url)
z = zipfile.ZipFile(StringIO.StringIO(r.content))
STARlookUpSubgroupID2013=pd.read_csv(z.open(STARlookUpSubgroupID2013fileName))
重命名列ID以允许合并
STARlookUpSubgroupID2013 = STARlookUpSubgroupID2013.rename(columns={'001':'Subgroup ID'})
STARlookUpSubgroupID2013
合并成功
merged = pd.merge(STAR2013,STARlookUpSubgroupID2013, on='Subgroup ID')
尝试第二次合并。这是内存溢出发生的地方
merged=pd.merge(merged, STARentityList2013, on='School Code')
我在ipython笔记本上做了所有这些,但不认为这会改变什么。
虽然这是个老问题,但我最近遇到了同样的问题。
在我的例子中,两个数据帧中都需要重复的键,我需要一个方法,该方法可以在计算之前判断合并是否适合内存,如果不适合,则更改计算方法。
我想出的方法如下:
计算合并大小:
注:
目前用这种方法,密钥只能是一个标签,不能是一个列表。为
group_by
使用列表当前返回列表中每个标签的合并大小之和。这将导致合并大小远远大于实际合并大小。如果正在使用分组依据的标签列表,则最终行大小为:
检查这是否符合记忆
这里定义的
merge_size
函数返回将两个数据帧合并在一起创建的行数。通过将其与两个数据帧中的列数相乘,然后乘以np.float[32/64]的大小,可以大致了解生成的数据帧在内存中的大小。然后可以将其与^{} 进行比较,看看您的系统是否可以计算完全合并。
本文提出了
merge_size
方法作为pandas
的扩展。https://github.com/pandas-dev/pandas/issues/15068。相关问题 更多 >
编程相关推荐