合并pandas groupBy对象

6

我有一个包含292百万行数据(6GB)的CSV格式庞大数据集。Panda的read_csv函数无法处理如此大的文件。因此,我使用以下代码迭代地以小块(1000万行)读取数据:

for chunk in pd.read_csv('hugeData.csv', chunksize=10**7):
       #something ...

在#something中,我根据某些列对行进行分组。因此,在每次迭代中,我都会获得新的groupBy对象。我无法合并这些groupBy对象。
一个更小的虚拟示例如下:
在这里,dummy.csv是一个28行的CSV文件,它是一些国家在某年之间的贸易报告。sitc是一些产品代码,export是以十亿美元计算的出口金额。(请注意,数据是虚构的)
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)]

因此,我考虑通过按groupBy方式一次性对它们进行排列来节省时间。
非常感谢任何建议。

对于 origin : aus 和 dest : ind,合并后的数据应为:{ 2000 : 6, 2001 : 25, 2002 : 14 }。 - Pushpendu Ghosh
两个 groupby 对象只是数据框的切片,您可以使用标准工具如 pd.concatpd.mergepd.join 将它们合并。 - hellpanderr
我将第一个分割存储在xd0中,第二个分割存储在xd1中,并应用了 pd.merge(xd0,xd1,on="origin")。但是我遇到了错误: ValueError: can not merge DataFrame with instance of type <class 'pandas.core.series.Series'> - Pushpendu Ghosh
这个代码是有效的:pd.concat([xd0,xd1], axis=1)。但它会创建两个不同的导出列。 [aus ind 2000 6.0 NaN], [aus ind 2001 8.0 17.0], [aus ind 2002 NaN 14.0] - Pushpendu Ghosh
你能展示一下你需要的输出吗? - hellpanderr
@hellpanderr:先生,我更新了我的答案,以明确输出应该是什么样子的。 - Pushpendu Ghosh
1个回答

4
你可以使用 pd.concat 来连接 groupby 的结果,然后应用 sum:
>>> 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

@hellpanderr先生,问题已经解决。合并并创建一个大型简化字典(1,000,816行)需要9分钟。进一步的查询执行输出所需的时间非常短(以毫秒为单位)。我是否可以将groupBy对象以字典形式保存在本地硬盘上?这样,下次重新开始时,我就可以直接加载数据(显然少于9分钟)并输出查询结果。 - Pushpendu Ghosh
是的先生。完整巨大的系列。行数为100万,希望能够保存在一些MB中,其加载时间非常短。这样下次如果只加载(“series.xyz”),我可以在几秒钟内获取系列数据。 - Pushpendu Ghosh
@hellpanderr先生,save as的意思是我想将它写入我的硬盘,就像我们在xd.to_csv('series.csv')中所做的那样。 - Pushpendu Ghosh
你所说的字典形式是什么意思?类似于JSON吗? - hellpanderr
1
先生,我解决了。xd.to_pickle("./backup.pkl") 然后回调 xdBack = pd.read_pickle("./dummy.pkl")。非常感谢您的帮助。 - Pushpendu Ghosh
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接