У меня есть огромный набор данных из 292 миллионов строк (6 ГБ) в формате CSV. Функция Panda read_csv
не работает для такого большого файла. Поэтому я читаю данные в небольших кусках (10 миллионов строк) итерационно с помощью этого кода:
for chunk in pd.read_csv('hugeData.csv', chunksize=10**7):
#something ...
В #something я группирую строки по некоторым столбцам. Поэтому на каждой итерации я получаю новые объекты groupBy. Я не могу объединить эти объекты groupBy.
Пример меньшего фиктивного примера выглядит следующим образом:
Здесь dummy.csv
представляет собой файл CSV с 28 строками, который является торговым отчетом между некоторыми странами в течение некоторого года. sitc - это код продукта, а экспорт - это сумма экспорта в несколько миллиардов долларов США. (Обратите внимание, что данные вымышлены)
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 строки данных и сгруппировал их в соответствии с годом, происхождением, dest.
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)]
Поэтому я думал сэкономить время, когда-то организовывал их в групповой манере.
Любое предложение очень ценится.
Вы можете использовать pd.concat
для объединения результатов группы, а затем применить 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
pd.concat
? Огромная серия?
Вопрос здесь:
Выходная таблица, кажется, объединила ячейки для первых двух столбцов после использования функции groupby. Кто-нибудь знает, как мы можем разделить объединенные ячейки?
pd.concat
,pd.merge
,pd.join
.