#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(). подробнее здесь