Объединение панд groupBy объектов

1

У меня есть огромный набор данных из 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)]

Поэтому я думал сэкономить время, когда-то организовывал их в групповой манере.

Любое предложение очень ценится.

  • 0
    Для источника : aus и dest : ind, объединенные данные должны быть: {2000: 6, 2001: 25, 2002: 14}
  • 0
    Два объекта groupby являются просто фрагментами данных, их можно объединить с помощью стандартных инструментов, таких как pd.concat , pd.merge , pd.join .
Показать ещё 4 комментария
Теги:
pandas
performance
pandas-groupby
bigdata

2 ответа

0
Лучший ответ

Вы можете использовать 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
  • 0
    Сэр @hellpanderr, проблема решена. Слияние и создание большого упрощенного словаря (1 000 816 строк) занимает 9 минут. Дальнейшее выполнение запроса занимает незначительное время (в мс) для вывода. Есть ли способ сохранить объект groupBy на локальном жестком диске в виде словаря. Так что в следующий раз, когда я начну заново, я могу напрямую загрузить данные (очевидно, менее чем за 9 минут) и вывести запросы.
  • 0
    Вы хотите сохранить результат pd.concat ? Огромная серия?
Показать ещё 5 комментариев
0

Вопрос здесь:

Выходная таблица, кажется, объединила ячейки для первых двух столбцов после использования функции groupby. Кто-нибудь знает, как мы можем разделить объединенные ячейки?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню