Объединение панд groupBy объектов - PullRequest
0 голосов
/ 20 сентября 2018

У меня огромный набор данных из 292 миллионов строк (6 ГБ) в формате CSV.Функция Panda read_csv не работает для такого большого файла.Поэтому я читаю данные небольшими порциями (10 миллионов строк) итеративно, используя этот код:

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

В # что-то я группирую строки по некоторым столбцам.Таким образом, в каждой итерации я получаю новые объекты groupBy.Я не могу объединить эти объекты groupBy.

Вот меньший фиктивный пример:

Здесь dummy.csv - это файл CSV с 28 строками, который используется для торговли.отчет между некоторыми странами в каком-то году. 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)]

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

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

1 Ответ

0 голосов
/ 20 сентября 2018

Вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...