合并熊猫分组对象

时间:2018-09-20 12:36:45

标签: python pandas performance bigdata pandas-groupby

我有一个庞大的数据集,其中包含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)]

因此,我一直想通过按组方式安排它们来节省时间。

任何建议都将不胜感激。

1 个答案:

答案 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)