【发布时间】:2015-12-21 10:39:15
【问题描述】:
我是 Pandas 的新手,正在尝试合并一些数据子集。我给出了一个发生这种情况的具体案例,但问题是一般性的:它是如何/为什么会发生的,我该如何解决?
我加载的数据大约是 85 Megs 左右,但我经常看到我的 python 会话运行接近 10 gigs 的内存使用然后出现内存错误。
我不知道为什么会发生这种情况,但这让我很生气,因为我什至无法开始以我想要的方式查看数据。
这是我所做的:
导入主要数据
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 notebook 中完成了所有这些操作,但我认为这不会改变任何事情。
【问题讨论】:
-
检查合并前后每个数据框的形状
-
当
on键列中存在重复项时,我遇到了这种行为。当我删除重复项时,一切正常。您可以查看 DataFrame 形状以检查是否得到任何意外结果。 -
可能有帮助的一件事是将 DataFrames 的创建放在函数中,这样可以关闭字符串和 zip 文件并进行垃圾收集(而不是坐在内存中)。一个问题是您预计最终合并的规模有多大?如果你有一个 n 行与一个 m 行合并,它可以是 n*m 行,这里可能非常大。
-
DataFrame也是2亿行!!!我的机器表明我已经在 2.5Gb 左右阅读。
-
@Alexander:使用 .size() ? @yakym:你能举个例子吗? @Andy:2亿行很大,但这不是panda的重点吗?更好地处理数据和“大数据”。我喜欢在功能理念中进行合并。必须收集更多这样的记忆技巧。
标签: python memory pandas merge out-of-memory