Объединить результат groupby с исходным фреймом данных в pandas

#python #pandas

#python #pandas

Вопрос:

У меня есть следующий фрейм данных pandas с 411165 строками:

     LastTime        Dur         SrcAddr     DstAddr    Proto Sport  Dport
0   03:20:18.581977 0.816447    10.0.0.1    10.0.0.4    udp 57532   tftp
1   03:20:32.313861 4.885413    10.0.0.2    10.0.0.4    udp 59977   tftp
2   03:20:37.366970 4.938308    10.0.0.2    10.0.0.4    udp 59977   tftp
3   03:20:42.420143 4.938177    10.0.0.2    10.0.0.4    udp 59977   tftp
4   03:20:47.473281 4.938372    10.0.0.2    10.0.0.4    udp 59977   http-alt
... ... ... ... ... ... ... ...
411161  22:28:29.841361 0.000000    231.127.193.147 10.0.0.4    udp 37335   tftp
411162  22:28:29.933401 0.000000    39.216.12.51    10.0.0.4    udp 36823   tftp
411163  22:28:29.997108 0.000000    153.183.248.241 10.0.0.4    udp 37336   tftp
411164  22:28:30.148128 0.000000    49.29.36.35 10.0.0.4    udp 36824   tftp
411165  22:28:30.229133 0.000000    62.248.30.126   10.0.0.4    udp 37337   tftp
  

Я выполнил операцию groupby над фреймом данных партиями по 100:

 grouper=dataset.groupby([(np.arange(len(dataset.index))//100),'DstAddr','Dport'])
ct_sv_dst=grouper['LastTime'].count()
  

Результатом операции groupby является:

 DstAddr   Dport   
0     10.0.0.3  http-alt      2
      10.0.0.4  tftp         98
1     10.0.0.3  http-alt     33
      10.0.0.4  tftp         67
2     10.0.0.3  http-alt     34
                           ... 
4107  10.0.0.4  tftp        100
4108  10.0.0.4  tftp        100
4109  10.0.0.4  tftp        100
4110  10.0.0.4  tftp        100
4111  10.0.0.4  tftp         66
Name: LastTime, Length: 6252, dtype: int64
  

теперь я хочу объединить результат операции group by с исходным фреймом данных, пожалуйста, кто-нибудь может подсказать мне, как я могу этого добиться.
Результат, который я хочу, выглядит следующим образом:

       LastTime      Dur         SrcAddr     DstAddr    Proto Sport  Dport gc
0   03:20:18.581977 0.816447    10.0.0.1    10.0.0.4    udp 57532   tftp  98
1   03:20:32.313861 4.885413    10.0.0.2    10.0.0.4    udp 59977   tftp  98
2   03:20:37.366970 4.938308    10.0.0.2    10.0.0.4    udp 59977   tftp  98
3   03:20:42.420143 4.938177    10.0.0.2    10.0.0.4    udp 59977   tftp  98
4   03:20:47.473281 4.938372    10.0.0.2    10.0.0.4    tcp 59977  http-alt 2
.
.
100  02:20          3.232       10.0.0.1    10.0.0.3    tcp 3234  http-alt 33 
101  02:20          3.232       10.0.0.1    10.0.0.4    udp 3234  tftp    67   
  

Комментарии:

1. Вы хотите объединить результаты подсчета в исходный фрейм данных?

2. да, аналогично последнему фрейму данных со столбцом с именем gc

Ответ №1:

Это сделало бы работу.

 dataset['gc'] = grouper['LastTime'].transform('count')
  

Ответ №2:

перед объединением необходимо убедиться, что 2 фрейма данных имеют одинаковые столбцы. Пока в результате операции groupby отсутствуют несколько столбцов. Исправьте это, передав дополнительные правила группировки столбцов в ct_sv_dst = grouper.agg({'LastTime':'count', 'proto':lambda x: x.value_counts().index[0], MORE AGG RULES HERE})

Затем объединить исходный фрейм данных и результат groupby()agg() с помощью pd.DataFrame.concat(). подробнее здесь