我有一个包含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方式一次性对它们进行排列来节省时间。
非常感谢任何建议。
pd.concat
、pd.merge
和pd.join
将它们合并。 - hellpanderrpd.merge(xd0,xd1,on="origin")
。但是我遇到了错误:ValueError: can not merge DataFrame with instance of type <class 'pandas.core.series.Series'>
。 - Pushpendu Ghoshpd.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