我有一个庞大的数据集,其中包含2.92亿行(6 GB)的CSV格式。熊猫的read_csv
函数不适用于如此大的文件。因此,我使用以下代码迭代读取小块数据(1000万行):
for chunk in pd.read_csv('hugeData.csv', chunksize=10**7):
#something ...
在#something中,我根据某些列对行进行分组。因此,在每次迭代中,我都会得到新的groupBy对象。我无法合并这些groupBy对象。
一个较小的虚拟示例如下:
此处dummy.csv
是28行CSV文件,它是某年某些国家之间的贸易报告。 sitc 是一些产品代码, export 是大约10亿美元的出口金额。 (请注意,数据是虚构的)
year,origin,dest,sitc,export
2000,ind,chn,2146,2
2000,ind,chn,4132,7
2001,ind,chn,2146,3
2001,ind,chn,4132,10
2002,ind,chn,2227,7
2002,ind,chn,4132,7
2000,ind,aus,7777,19
2001,ind,aus,2146,30
2001,ind,aus,4132,12
2002,ind,aus,4133,30
2000,aus,ind,4132,6
2001,aus,ind,2146,8
2001,chn,aus,1777,9
2001,chn,aus,1977,31
2001,chn,aus,1754,12
2002,chn,aus,8987,7
2001,chn,aus,4879,3
2002,aus,chn,3489,7
2002,chn,aus,2092,30
2002,chn,aus,4133,13
2002,aus,ind,0193,6
2002,aus,ind,0289,8
2003,chn,aus,0839,9
2003,chn,aus,9867,31
2003,aus,chn,3442,3
2004,aus,chn,3344,17
2005,aus,chn,3489,11
2001,aus,ind,0893,17
我将其分为两个14行数据,并根据年份,原点和目的地进行分组。
for chunk in pd.read_csv('dummy.csv', chunksize=14):
xd = chunk.groupby(['origin','dest','year'])['export'].sum();
print(xd)
结果:
origin dest year
aus ind 2000 6
2001 8
chn aus 2001 40
ind aus 2000 19
2001 42
2002 30
chn 2000 9
2001 13
2002 14
Name: export, dtype: int64
origin dest year
aus chn 2002 7
2003 3
2004 17
2005 11
ind 2001 17
2002 14
chn aus 2001 15
2002 50
2003 40
Name: export, dtype: int64
如何合并两个GroupBy对象?
会合并它们,再次在大数据中造成内存问题吗?从数据的性质来看,如果正确合并,行数肯定会减少至少10到15倍。
基本目标是:
给出来源国和目的地国, 我需要每年绘制它们之间的总出口。 每次对整个数据进行查询都需要大量时间。
xd = chunk.loc[(chunk.origin == country1) & (chunk.dest == country2)]
因此,我一直想通过按组方式安排它们来节省时间。
任何建议都将不胜感激。
答案 0 :(得分:1)
您可以使用sum
来加入groupby结果,然后应用>>> pd.concat([xd0,xd1],axis=1)
export export
origin dest year
aus ind 2000 6 6
2001 8 8
chn aus 2001 40 40
ind aus 2000 19 19
2001 42 42
2002 30 30
chn 2000 9 9
2001 13 13
2002 14 14
>>> pd.concat([xd0,xd1],axis=1).sum(axis=1)
origin dest year
aus ind 2000 12
2001 16
chn aus 2001 80
ind aus 2000 38
2001 84
2002 60
chn 2000 18
2001 26
2002 28
:
SELECT * FROM flows, steps WHERE flows.step_id = step.id AND NOW() > ADDDATE(flows.active_on, steps.relative_time)